Сегодня я получил короткий "тест навыков С++" от Elance.com. Один вопрос заключался в следующем:
Что такое уязвимость безопасности в следующей строке кода:
printf("%s", argv[1]);
Вариант 1: Строка формата
Вариант 2: переполнение стека < - Это было отмечено Elance как правильный ответ
Пользователю было предоставлено 10 секунд, чтобы ответить на этот вопрос через несколько секунд после появления вопроса (или автоматически не решить вопрос). (Были также два других явно нерелевантных ответа, которые не были отмечены как правильный ответ Элансом.)
Я искал переполнение буфера или переполнение буфера в качестве опции.
Мне инстинктивно не понравилось переполнение стека ответов, потому что за 10 секунд я мысленно использовал то, что я считаю стандартным определением "Переполнение стека" :
В программном обеспечении переполнение стека происходит, когда указатель стека превышает связанный стек. Стек вызова может состоять из ограниченного количества адресное пространство, часто определяемое в начале программы...
В соответствии с этим определением "Переполнение стека" переполнение буфера полностью возможно без; это переполнение стека только в том случае, если программа пытается писать вне общего распределения стека вызывающей программы (из-за переполнения буфера или в противном случае это была бы законная запись, такая как выделение памяти для стека на основе переменных).
Мой 10-секундный инстинкт сказал мне, что "переполнение буфера" является более точным описанием проблемной строки кода выше - потому что часто (по моему опыту) имеется достаточное количество нулевых символов ('\0'
), набитых данными мусора в ОЗУ, чтобы избежать фактического в таких случаях, но переполнение буфера в реализации кажется разумным возможным или даже вероятным. (Но возможность того, что printf
читает мусор здесь, может предположить, что argc == 1
, так что не было предоставлено пользователем argv[1]
; если присутствует argv[1]
, возможно, можно предположить, что вероятность того, что вызывающая функция не вставлена NULL
. В проблеме не было указано, присутствовал ли argv[1]
.)
Поскольку я думал, что здесь может быть проблема переполнения буфера, даже без, я ответил Формат строки, потому что просто передав другую строку формата, например "%.8s"
, проблема в большинстве случаев можно избежать, так что это похоже на общий более общий и, следовательно, лучший ответ.
Мой ответ был помечен как неправильный. Правильный ответ был отмечен как "Переполнение стека" .
Теперь мне приходит в голову, что, возможно, если предположить, что argv[1]
присутствует, то возможное переполнение буфера только - это переполнение стека, и в этом случае переполнение стека может быть действительно правильным ответ. Однако, даже в этом случае, не считалось бы нечетным назвать это переполнение стека? Не переполнение буфера - лучший способ описать эту проблему, даже если присутствует argv[1]
? И, если argv[1]
присутствует не, не так ли неверно утверждать, что проблема представляет собой переполнение стека, а не более точное переполнение буфера?
Мне хотелось бы мнение профессионалов на этом сайте: "Переполнение стека" - это правильный способ определить проблему безопасности памяти с указанной выше строкой кода? Или, скорее, "переполнение буфера" или "переполнение буфера" , очевидно, лучший способ описать проблему? Наконец, учитывая два параметра, предоставленные для ответа на вопрос (см. Выше), является ли ответ неоднозначным или "переполнение стека" (или "строка формата" ), очевидно, лучший ответ?
Тангенциальные комментарии относительно теста Elance (не относится к вопросу в этой публикации)
Ни один тест Elance " С++" не касался любых С++-специфических функций, таких как классы, шаблоны, что-либо в STL или любой аспект полиморфизма, Каждый вопрос был вопросом "вниз и вперед", прямо с вопроса.
Потому что было много (по крайней мере, 3) другие вопросы Еланки так называемых "C навыки ++ тестом", которые были неоспоримо неправильно (например, этим вопрос: учитывая sizeof(int) == sizeof(int*)
и sizeof(int) == 4
, то в коде int *a, *b; a=b; b++; b-a;
, что b-a
, с правильным ответом, указанным как 4
, а не фактическим правильным ответом 1
), и учитывая тот факт, что на тесте не было вопросов, связанных с С++, я связался с Elance и планируют серьезно проводить свои проблемные испытания с организацией. Однако для вопроса, обсуждаемого в этой публикации, я не уверен, что вопрос/ответы проблематичны.