Проверка границ для массивов переменной длины (VLA)? - PullRequest
5 голосов
/ 18 апреля 2011

Есть ли способ проверить переполнение буфера в VLA? Я использовал -fstack-protector-all -Wstack-protector , но получил следующие предупреждения:

предупреждение: не защищать локальные переменные: буфер переменной длины

Есть ли библиотека для достижения этой цели? (-защита для кучи памяти)

В настоящее время я использую Valgrind и GDB.

Ответы [ 3 ]

1 голос
/ 18 апреля 2011

Вы можете использовать -fmudflap вместо -fstack-protector-all

Обновление : некоторые документы и опции находятся здесь http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging

0 голосов
/ 18 апреля 2011

Я не понимаю, как библиотека могла бы сделать это для вас; с массивом переменной длины вы не вызываете никаких функций для индексации, поэтому нет места для "зацепления" библиотеки. При malloc() распределение является явным в функции, и вы можете отслеживать его.

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

Я думаю что-то вроде изменения:

void work(int n)
{
  int data[n];   /* Our variable-length array. */

  data[0] = 0;
}

в нечто вроде:

#include "vla-tracking.h"

void work(int n)
{
  VLA_NEW(int, data, n);  /* Our variable-length array. */

  VLA_SET(data, 0, 0);
}

Затем придумайте подходящие определения макросов (и вспомогательный код) для отслеживания доступа. Как я уже сказал, это не будет красиво. Конечно, идея заключается в том, что макросы смогут «компилироваться» только в простые определения, управляемые некоторыми настройками времени сборки (режим отладки / выпуска или что-то еще).

0 голосов
/ 18 апреля 2011

Возможно, использование alloca () поможет.Это раздражает, потому что c99 должен избавить вас от необходимости использовать его, но страница руководства GCC, кажется, говорит, что код защиты стека будет включен, если вы используете alloca ().

Конечно, реальное решение - написать идеальный, без ошибок код, который никогда не пытается испортить стек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...