Поврежденные аргументы при передаче в функцию? - PullRequest
0 голосов
/ 11 августа 2011

Я вижу то, что поставило меня в тупик.Может быть, вы, ребята, можете посоветовать.

То, что является допустимым аргументом, искажается при передаче в другую функцию.

Вот мои настройки:

  • LibA.a
  • LibB.a
  • SampleApp
  • MyApp.c

Неправильный вызов функции идет из LibA в LibB.

LibA, LibB и SampleApp были предварительно выполнены (к счастью в режиме отладки) более старой версией Sun Studio на Solaris x86 / 64.SampleApp использует как LibA, так и LibB и прекрасно работает в моей системе.

MyApp использует LibA и LibB аналогично SampleApp.Тем не менее, MyApp падает из-за этого повреждения указателя.

// File scoped string declared
static const char myString[] = "SomeText"

// The function call looks like  
libAfunc(myString, myIntVar)

// The called function prototype is like 
int libAfunc(const char* strArg, int intArg)

При однократном пошаговом выполнении кода я вижу, что указатель в вызывающей программе (myString) действителен и передается в качестве параметра.В вызываемой стороне адрес в переданном указателе параметра (strArg) просто неверен.Фактически, все параметры на самом деле неверны после передачи.

Примечание: вызывающая сторона находится в предварительно скомпилированном LibA, а вызываемая сторона находится в предварительно скомпилированном LibB.Я никогда даже не трогал этот код, так как он предварительно скомпилирован.Кроме того, сам код, вероятно, является правильным, поскольку SampleApp использует эти функции и работает нормально.(Хотя последовательность вызовов может немного отличаться ...)

Я думаю, что моя ошибка в стадии связывания, но я не уверен, что это может быть.

Есть идеи?

Спасибо

1 Ответ

1 голос
/ 11 августа 2011

Можете ли вы скомпилировать SimpleApp с вашим компилятором? Это все еще работает?

Я не знаком с вашей конкретной платформой, но было время с некоторыми компиляторами, когда указатели могли иметь разные размеры в зависимости от используемых опций компилятора.

Если ваш компилятор производил (скажем) 64-битные указатели, а библиотеки использовали 32-битные указатели, тогда ваши симптомы имеют смысл.

...