Как отладить "Stack smashing detected"? [закрытый]

у меня сложный код на c++.

Это программа FastCGI, использующая http://althenia.net/fcgicc

когда я прошу его для url looooong, я получаю

*** stack smashing detected ***: ./tileserve terminated
Erreur de segmentation

для реальной жизни это не проблема, так как я никогда не использую так долго URL-адреса, но это означает, что кто-то может завершить мой сервер.... Мне это не нравится.

есть ли инструмент (и как его использовать?) чтобы найти, где появляется проблема ?

изменить : Решено

Ok решено.

Я делаю

int len;
char uri[200];

len = strlen(request.params[std::string("REQUEST_URI")].c_str());
printf("%dn", len);

if (len > 200) return 1;

strcpy(uri, request.params[std::string("REQUEST_URI")].c_str());

похоже, что 200 был слишком высок для теста Лена. Он фактически терпит неудачу в 194.

Так я и сделал:

if (len > 190) return 1;

Теперь все нормально.

2 ответов


Если Вы читаете веб-сайт, вы поймете, что это простая оболочка C++ над библиотекой C.

типичная проблема с библиотекой C-переполнение буфера:

#include <cstring>
#include <cstdio>

int main(int argc, char* argv[]) {
  char buffer[16]; // ought to be sufficient

  strcpy(buffer, argv[1]);
  printf("%s", buffer);
}

попробуйте эту программу:

> ./test "a"
a
> ./test "abcdefghijklmnoprqstuvwxyz"
???

поскольку буфер может содержать только 16 символов, остальные символы будут записаны после его окончания. Это stack smashing и неопределенное поведение.

ряд реализаций либо библиотека времени выполнения или ваша ОС могут обнаружить эту ситуацию в некоторых условиях и завершить программу.

или вы делают что-то не так или библиотека есть.

чтобы найти проблему, вы можете использовать Valgrind или запустить программу в отладчике. Кроме того, если ваша система позволяет это, у вас может быть дамп памяти в момент убийства программы. Вы также можете просмотреть этот дамп памяти в отладчике.


вы можете использовать что-то вроде valgrind, или ваш компилятор может иметь статический анализ, который может найти места, где вы можете переполнять буферы.

также вы можете просто проверить свой код на использование функций, подверженных ошибкам, таких как strcpy, и заменить их безопасными функциями, такими как strncpy, или еще лучше просто использовать объекты, которые управляют собственной памятью, такие как std::string.