Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat
Run-Time Check Failure #2 - Stack around the variable 'IP' was corrupted.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void CApplication::AddAddress() { //! Adds an address to the list. NetStream::CIP IP; ETargetType Type; char acBuffer[64]; std::cout << "IP: "; std::cin.getline(acBuffer, 64); IP.SetH(acBuffer); std::cout << "Type: "; std::cin.getline(acBuffer, 64); switch(tolower(acBuffer[0])) { case 's': Type = TYPE_SERVER; break; case 'w': Type = TYPE_WORKSTATION; break; default: std::cout << "Unknown type!"; std::cin.sync(); std::cin.get(); return; } std::cout << "New ID: " << m_Targets.AddIP(IP, Type)->usID; } // <-- Hier tritt angeblich der Fehler auf. |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
PingTargetVecIt CTargetList::AddIP(const NetStream::CIP &IP, const ETargetType &Type) { SPingTarget Target; Target.IP = IP; Target.Type = Type; Target.usID = m_Targets.size(); m_Targets.push_back(Target); return FindEntryByID(Target.usID); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
PingTargetVecIt CTargetList::FindEntryByID(const unsigned short usID) { for(PingTargetVecIt It = m_Targets.begin(); It != m_Targets.end(); It++) { if(It->usID == usID) return It; } return m_Targets.end(); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Target type enumeration enum ETargetType { TYPE_SERVER = 0, TYPE_WORKSTATION = 1 }; // Address structure struct SPingTarget { unsigned short usID; NetStream::CIP IP; ETargetType Type; }; const bool operator == (const SPingTarget &Left, const SPingTarget &Right); typedef std::vector<SPingTarget> PingTargetVec; typedef PingTargetVec::iterator PingTargetVecIt; typedef PingTargetVec::const_iterator PingTargetVecConstIt; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
namespace NetStream { /*! This is a class for IP-Addresses. */ class NETSTREAM_API CIP { public: // --- Constructors --------------------- CIP(); CIP(const std::string &IP); CIP(const char *pcIP); CIP(const CIP &pSrc); ~CIP(); // --- Basic-Methods -------------------- void SetH(const std::string &IP); void SetN(const unsigned long ulAddr); std::string GetH() const; unsigned long GetN() const; // --- Operators ------------------------ unsigned char &operator [] (unsigned char ucIndex); const bool operator == (const CIP &Right) const; const bool operator != (const CIP &Right) const; private: // --- Variables ------------------------ unsigned char m_ucAddr[4]; }; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
namespace NetStream { CIP::CIP() { //! Default constructor. SetH("0.0.0.0"); } CIP::CIP(const std::string &IP) { //! Initialising constructor. //! \param[in] IP the IP-Address. SetH(IP); } CIP::CIP(const char *pcIP) { //! Initialising constructor. //! \param[in] pcIP The IP-Address. SetH(pcIP); } CIP::CIP(const CIP &pSrc) { //! Copy constructor. //! \param[in] pSrc Reference to the Source object. m_ucAddr[0] = pSrc.m_ucAddr[0]; m_ucAddr[1] = pSrc.m_ucAddr[1]; m_ucAddr[2] = pSrc.m_ucAddr[2]; m_ucAddr[3] = pSrc.m_ucAddr[3]; } CIP::~CIP() { //! Destructor. } // ================================================================================================= // Basic-Methods void CIP::SetH(const std::string &IP) { //! Sets the IP-Address with an IP-String. //! \param[in] IP The IP String. if(sscanf_s(IP.c_str(), "%d.%d.%d.%d", &m_ucAddr[0], &m_ucAddr[1], &m_ucAddr[2], &m_ucAddr[3]) == -1) throw(std::bad_exception("Can not create IP-Address from String.")); } void CIP::SetN(const unsigned long ulAddr) { //! Sets the IP-Address with an Network-Ordered Address. //! \param[in] ulAddr The Address. char acBuffer[32]; in_addr Addr; Addr.S_un.S_addr = ulAddr; strcpy_s(acBuffer, 32, inet_ntoa(Addr)); SetH(acBuffer); } std::string CIP::GetH() const { //! Returns the Address in Host-Byte-Order. //! \return The IP-String. std::string Buffer; char acBuffer[32]; Buffer.clear(); /*_itoa_s(static_cast<signed>(m_ucAddr[0]), acBuffer, 32); Buffer += acBuffer; Buffer += "."; _itoa_s(static_cast<signed>(m_ucAddr[1]), acBuffer, 32); Buffer += acBuffer; Buffer += "."; _itoa_s(static_cast<signed>(m_ucAddr[2]), acBuffer, 32); Buffer += acBuffer; Buffer += "."; _itoa_s(static_cast<signed>(m_ucAddr[3]), acBuffer, 32); Buffer += acBuffer; Buffer += static_cast<signed>(m_ucAddr[0]); Buffer += "."; Buffer += static_cast<signed>(m_ucAddr[1]); Buffer += "."; Buffer += static_cast<signed>(m_ucAddr[2]); Buffer += "."; Buffer += static_cast<signed>(m_ucAddr[3]);*/ sprintf_s(acBuffer, "%d.%d.%d.%d", &m_ucAddr[0], &m_ucAddr[1], &m_ucAddr[2], &m_ucAddr[3]); return Buffer; } unsigned long CIP::GetN() const { // Returns the Address in Network-Byte-Order. // \return The IP-Address. return inet_addr(GetH().c_str()); } // ================================================================================================= // Operators unsigned char &CIP::operator [] (unsigned char ucIndex) { //! Returns one Byte of the Address. assert(ucIndex < 4); return m_ucAddr[ucIndex]; } const bool CIP::operator == (const CIP &Right) const { for(unsigned i = 0; i < 4; i++) { if(m_ucAddr[i] != Right.m_ucAddr[i]) return false; } return true; } const bool CIP::operator != (const CIP &Right) const { for(unsigned i = 0; i < 4; i++) { if(m_ucAddr[i] != Right.m_ucAddr[i]) return true; } return false; } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
std::string CIP::GetH() const { std::string Buffer; char acBuffer[32]; Buffer.clear(); sprintf_s(acBuffer, "%d.%d.%d.%d", &m_ucAddr[0], &m_ucAddr[1], &m_ucAddr[2], &m_ucAddr[3]); return Buffer; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
std::string CIP::GetH() const { char arr_buff[32]; std::sprintf(arr_buff, "%u.%u.%u.%u", m_ucAddr[0], m_ucAddr[1], m_ucAddr[2], m_ucAddr[3]); return std::string(arr_buff); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
const bool CIP::operator == (CIP const& rhs) const { for (unsigned char i(0); i < 4; ++i) if (m_ucAddr[i] != rhs.m_ucAddr[i]) return false; return true; } const bool CIP::operator != (CIP const & rhs) const { return !(*this == rhs); } |
C-/C++-Quelltext |
|
1 2 3 4 5 |
CIP::CIP() { //! Default constructor. SetH("0.0.0.0"); } |
C-/C++-Quelltext |
|
1 2 3 4 |
CIP::CIP { std::fill(m_ucAddr, m_ucAddr + 4, 0); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
void CIP::SetH(const std::string &IP) { //! Sets the IP-Address with an IP-String. //! \param[in] IP The IP String. if(sscanf_s(IP.c_str(), "%d.%d.%d.%d", &m_ucAddr[0], &m_ucAddr[1], &m_ucAddr[2], &m_ucAddr[3]) == -1) throw(std::bad_exception("Can not create IP-Address from String.")); } |
C-/C++-Quelltext |
|
1 2 3 4 |
void CIP::SetH(std::string const& str) { if (std::sscanf(str.c_str(), "%u.%u.%u.%u", &m_ucAddr[0], &m_ucAddr[1], &m_ucAddr[2], &m_ucAddr[3]) < 4) throw std::invalid_argument("invalid string"); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 |
void CIP::SetH(std::string const& str) { std::istringstream ss(str); char seperator; for (unsigned char i(0); i < 4; ++i) { ss >> m_ucAddr[i]; ss >> seperator; if (!ss || seperator != '.') throw std::invalid_argument("invalid string"); } } |
C-/C++-Quelltext |
|
1 2 3 4 |
CIP::CIP(CIP const & rhs) { std::memcpy(m_ucAddr, pSrc.m_ucAddr, 4 * sizeof (unsigned char)); } |
Zitat von »"Deviloper"«
Dann füllst du deinen Buffer acBuffer, aber nicht deinen String Buffer. Warum du clear aufrufst ist mir auch nicht ganz klar, (http://www.cplusplus.com/reference/string/string/clear.html) denn der String ist solange leer, bis du was rein tust
Zitat von »"Deviloper"«
Einen von beiden zu implementieren reicht hier. Wobei es die Frage ist, ob da eine Schleife wirklich notwendig ist, oder pure Faulheit
Zitat von »"Deviloper"«
ist in diesem Fall sicherlich unperformanter als ein einfaches:
.
C-/C++-Quelltext
1 2 3 4 CIP::CIP { std::fill(m_ucAddr, m_ucAddr + 4, 0); }
Zitat von »"Deviloper"«
. Das kann man noch verfeinern, aber sollte so in etwa aussehen.
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 void CIP::SetH(std::string const& str) { std::istringstream ss(str); char seperator; for (unsigned char i(0); i < 4; ++i) { ss >> m_ucAddr[i]; ss >> seperator; if (!ss || seperator != '.') throw std::invalid_argument("invalid string"); } }
Zitat von »"Deviloper"«
Dann dein Kopierkonstruktor könntest du auf folgendes Reduzieren:
. Oder std::copy geht auch, wobei für POD auch ein einfaches std::memcpy reicht!
C-/C++-Quelltext
1 2 3 4 CIP::CIP(CIP const & rhs) { std::memcpy(m_ucAddr, pSrc.m_ucAddr, 4 * sizeof (unsigned char)); }
Zitat von »"Deviloper"«
Was du in SetN macht, solltest du vllt. mal kurz erklären!
Zitat von »"Deviloper"«
Sonst sollte das so alles stimmen und der Fehler wo anders liegen
Werbeanzeige