Кто-нибудь знает, почему это могло произойти?
У меня есть программа на C в AIX 5.3, меня попросили запустить ее на машине SPARC Solaris 10, но когда я это сделал, я заметил переполнение буфера при одном из многих безрассудных действий strcat. Моя цель не в том, чтобы очистить код, а в том, чтобы дать конкретный и обоснованный ответ о том, почему это переполнение происходит в Solaris, а не в AIX, являющейся точно такой же плохо закодированной программой.
Я немного читал о том, может ли это быть вызвано:
различия в порядках байтов между AIX и Solaris.
Выполнение функции strcat (AIX копирует справа налево, а Solaris слева направо), но я не смог найти никакой документации по этому вопросу.
- Просто и повезло, что эта проблема не возникает в AIX.
Любой свет, который вы могли бы пролить на это, высоко ценится.
РЕДАКТИРОВАТЬ: можно ли этого избежать с помощью флага noexec_user_stack на солярисе?
РЕДАКТИРОВАТЬ 2: Кто-нибудь есть какая-либо информация о том, как обе операционные системы фактическое копирование байтов? в ситуации, подобной варианту 2 выше?
РЕДАКТИРОВАТЬ 3: Вот кусок кода:
/*global*/<br>
char bufferA[101];<br>
/*inside function*/<br>
bufferA[0]='\0';<br>
strcpy(bufferA,"1");<br>
if (atoi(something)==0) {<br>
strcat(bufferA,pieces_of_data);<br>
count ++ ;<br>
}
, очевидно, есть и больше, но это единственная часть, где используется bufferA, и есть две переменные, объявленные глобальными после bufferA, которые повреждаются, когда последняя часть последней строки добавляется в bufferA.
Как я уже говорил, если я изменю декларацию с 101 на 201, коррупция не произойдет.
РЕДАКТИРОВАТЬ 4: кто-нибудь знает что-нибудь о параметрах компилятора -misalign и -misalign2 в Solaris? может ли быть какой-либо свет с этими параметрами? На самом деле, лучший вопрос был бы: есть ли разница между AIX powerPC и Solaris SPARC в отношении выравнивания? Хотя, возможно, это вопрос к ошибке сервера, но, если вы что-то знаете, поделитесь, пожалуйста.