Есть ли какой-нибудь простой способ определить, был ли параметр, переданный функции (аргумент const char *), константным литералом или переменной?
Я пытаюсь исправить ошибки в некотором коде, который заполнен вызовами IsBadWritePtr, которые генерируют исключения нарушения доступа, если параметр был константным литералом.
Это была ужасная глупость в дизайне, но теперь мне не разрешено менять неловкое поведение.
Вы можете добавить другую перегрузку, которая будет лучше соответствовать строковым литералам. Это не совсем наука но только эвристика
void f(const char* p); // potential literal
void f(char *p); // pointer to non-const
Другой идеей было бы воспользоваться тем, что литералы действительно массивы:
template <int N>
void f(const char (&_)[N]); // potential literal
Обратите внимание, что они не совсем обнаруживают буквальный против не буквальный, а скорее некоторые другие особенности. const char* p = createANewString(); f(p);
будет разрешать f(const char*)
, а также const char x[] = { 'A', 'b', 'c', '\0' };
разрешу к шаблону. Ни один из них не литералы, но вы, вероятно, тоже не хотите изменять.
После того, как вы внесете это изменение, будет просто узнать, где вызывается каждая из перегрузок.
Все это работает при условии, что главная функция не должна принимать аргумент как const char*
если он изменяет его внутренне, и проблема, с которой вы сталкиваетесь, заключается в том, что для обратной совместимости ваш компилятор разрешает вызов функции, которая принимает указатель на non-const с литералом …
Я не думаю, что есть способ обнаружить это, по крайней мере, без использования некоторых хакеров.
Поскольку интерфейс занимает const char *
ответственность функции заключается в том, чтобы не изменять переданную строку в любом случае. Вам нужно изменить реализацию, потому что она просто неверна.
VirtualQuery
может использоваться, чтобы определить, доступен ли адрес для записи, только для чтения или недоступен. Изучите State
а также Protect
члены вернулись MEMORY_BASIC_INFORMATION
структура, чтобы увидеть, если память доступна и имеет доступ, который вам нужен.