Как можно переполнить буфер на одной платформе, а не на другой? - PullRequest
2 голосов
/ 22 февраля 2011

Я не решаюсь задать этот вопрос из-за неопределенности ситуации, но я хотел бы понять, как это возможно.У меня есть приложение C ++, разработанное с использованием Visual Studio 2008. Когда я компилирую приложение в 64-битной Windows 7 (или 32-битной Vista), приложение работает нормально.Когда я компилирую приложение на 32-битной Windows XP SP3, я получаю предупреждение о переполнении буфера, и процесс завершается.Это использует ту же версию компилятора Visual Studio 2008 C ++.Как получается, что я получаю переполнение буфера на XP, но не на других платформах Windows?

Ответы [ 5 ]

4 голосов
/ 22 февраля 2011

Удача, фундаментальная неопределенность Вселенной или (более вероятно, чем предыдущая) деталь реализации, которая изменилась в msvcrt.dll между XP и 7.

Суть в том, что у вас есть ошибка в вашем приложении, и вы должны это исправить.

4 голосов
/ 22 февраля 2011

Напишите код, чтобы у вас не было переполнения буфера, и у вас не будет этой проблемы на любой платформе. А именно, убедитесь, что вы проверяете границы для буфера, к которому вы обращаетесь, чтобы убедиться, что вы не пытаетесь читать / писать за пределами правильных границ.

3 голосов
/ 22 февраля 2011

Возможно, у вас переполнение буфера в обоих случаях, в первом случае он не обнаружен и (очевидно) не причиняет вреда.Во втором это обнаружено.(Если он находится в динамически распределенной памяти, вы должны знать, что распределители часто выделяют больше, чем запрошено, поэтому правдоподобным объяснением является то, что в первом случае переполнение остается в этой зоне, а во втором - нет).

1 голос
/ 23 февраля 2011

Windows-7 имеет функцию, называемую отказоустойчивая куча, которая, как говорится, терпима к некоторым ошибочным доступам к буферу. Windows XP не имеет этой функции (Vista, я не знаю). Об этом на канале channel9.msdn.com или sysinternal.com (забыл, где именно) есть видео Марка Руссиновича.

1 голос
/ 22 февраля 2011

Размеры типов данных могут меняться от одного компилятора к другому (спасибо @AndreyT). Использование жестко закодированных чисел, таких как sizeof(4), для представления размера типа данных в вашем коде может вызвать ошибку в вашем приложении. Вместо этого вы должны использовать sizeof(int) или любой интересующий вас тип.

...