C ++ GCC4.4 تحذير: مجموعة الصفيف هو فوق حدود الصفيف

StackOverflow https://stackoverflow.com/questions/1168525

  •  19-09-2019
  •  | 
  •  

سؤال

لقد قمت مؤخرا بالترقية مؤخرا إلى دول مجلس التعاون الخليجي 4.4 (Mingw TDM Build) والآن تنتج الرمز التالي هذه التحذير:

في وظيفة الأعضاء "Void Console :: Print (Const STD :: String &) ':

تحذير: مجموعة الصفيف هو فوق حدود الصفيف

إليك الرمز:

void Console::print( const std::string& str ) {
        std::string newLine( str );
        if( newLine.size() > MAX_LINE_LENGTH ) {
            sf::Uint32 stringSize = newLine.size();
            for( sf::Uint32 insertPos = MAX_LINE_LENGTH;
                    insertPos < stringSize; insertPos += MAX_LINE_LENGTH ) {
                newLine.insert( insertPos, "\n" );
            }
        }

        StringList tokens;
        boost::split( tokens, newLine, boost::is_any_of("\n") );

        for( StringList::iterator it = tokens.begin();
                it != tokens.end(); ++it ) {
            addLine( *it );
        }
    }

أيه أفكار؟


إنها التحسينات التي تفعل ذلك ...

كما يبدو أن هذا الخط الذي يسبب ذلك:

boost::split( tokens, newLine, boost::is_any_of("\n") );

آه نعم، لقد وجدت ذلك، إنها حجة دفعة :: is_any_of ()، عن طريق التفاف في سلسلة () منشئ التحذير بعيدا، شكرا لكم جميعا على مساعدتكم :)

boost::split( tokens, newLine, boost::is_any_of( string( "\n" ) ) );
هل كانت مفيدة؟

المحلول

حصلت على نفس الخطأ. كحل حل محل

is_any_of(" ")

مع

is_from_range(' ', ' ')

والتي قد تكون أيضا أكثر كفاءة قليلا.

نصائح أخرى

يمكن أن يكون لديك شيء ما له علاقة واحدة أو أكثر من هذه الأخطاء الخليجية:

نتائج البحث عن GCC Bugzilla for "تحذير: مجموعة صفيفية فوق حدود الصفيف"

ليست كلها صالحة، ولكن هناك بعض تلك الثابتة إذا كنت تبحث حولها، أيضا:

http://gcc.gnu.org/bugzilla/show_bug.cgi؟id=37861.

لذلك أنا متأكد من وجود شيء يحدث هناك. بناء على التعليقات، سأحاول التجميع دون تحسين ومعرفة ما إذا كان يذهب بعيدا.

حصلت على حدود متشوكة تحذير باستخدام إحدى الخوارزميات القياسية (STD :: إزالة، وأعتقد) ويمر معلمات ITERATGER:

myarray, 
myarray + sizeof(myarray)/sizeof(*myarray)

التي أنا متأكد جدا في الحدود. كان فقط في رمز اللعبة، رغم ذلك، لذلك أنا فقط أحال حوله. إذا كانت دول مجلس التعاون الخليجي حقا رمي تحذيرات المراوغة، فستضطر فقط إلى تفتيش التعليمات البرمجية الخاصة بك بعناية للغاية حتى يتم إصلاحها.

لاحظت أن حلقةك هنا تتغير طول السلسلة، ولكن لا تقوم بتحديث حالة إنهاء الحلقة. هل يمكن أن يكون هذا مصدر مشكلتك؟

   sf::Uint32 stringSize = newLine.size();
   for( sf::Uint32 insertPos = MAX_LINE_LENGTH;
      insertPos < stringSize; insertPos += MAX_LINE_LENGTH ) 
   {
      newLine.insert( insertPos, "\n" );
      // You were probably wanting to put this here..
      insertPos++;
      stringSize++;
   }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top