powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Invalidate variable
10 сообщений из 10, страница 1 из 1
Invalidate variable
    #39487782
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ли в С++/GCC способ объявить переменную невалидной с тем, чтобы любое обращение к ней
в последующем коде вызывало ошибку компиляции? Для случаев типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
void foo(bar* x)
{
   delete x;
   // отсюда и далее обращение пьяного программиста к х должно быть обломано
   bar* y = x; // Ошибка компиляции тут была бы весьма к месту
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Invalidate variable
    #39487787
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Слишком частный случай. А как быть в случае вызывающей стороны, там-то x можно будет присвоить любой переменной после вызова. Да и вообще, копий этого указателя может быть овер 9000 в разных частях кода, так что вылавливать такой частный случай смысла нет.
Но никто не запрещает тебе в GCC подключить какой-нибудь linter и в него уже наконфигать своих правил. Но это будет ооочень геморно. В LLVM с этим проще, имея полный доступ к IR коду.
...
Рейтинг: 0 / 0
Invalidate variable
    #39487818
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все уже сделано до нас ))
Код: plaintext
1.
2.
3.
4.
5.
6.
void foo(int* x)
{
    delete x;
    int y = x; // так можно потому что не разыменовывается
    *y = 20; // ошибка, cppcheck отследил что в y находится x, и он разыменован
}


Код: plaintext
1.
2.
3.
$ cppcheck main.cpp 
Checking main.cpp...
[main.cpp:89]: (error) Dereferencing 'x' after it is deallocated / released
...
Рейтинг: 0 / 0
Invalidate variable
    #39487827
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

С маленькой областью видимости испрользовать.

С большой - переименовать. Все ошибки заменить на п.А.
...
Рейтинг: 0 / 0
Invalidate variable
    #39487831
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
    int x;
    x = 7;
    {
    typedef float x;     // kill it
    x = 6; // <- error
    }
...
Рейтинг: 0 / 0
Invalidate variable
    #39487844
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем это?
...
Рейтинг: 0 / 0
Invalidate variable
    #39487865
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

макросами можно, если локально
...
Рейтинг: 0 / 0
Invalidate variable
    #39487966
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЕсть ли в С++/GCC способ объявить переменную невалидной с тем, чтобы любое обращение к ней
в последующем коде вызывало ошибку компиляции? Для случаев типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
void foo(bar* x)
{
   delete x;
   // отсюда и далее обращение пьяного программиста к х должно быть обломано
   bar* y = x; // Ошибка компиляции тут была бы весьма к месту
}




прямого аналога в с++ нет
Но, можно переменную заключить в блок (фигурные скобки), тогда вне блока она не будет видна
...
Рейтинг: 0 / 0
Invalidate variable
    #39488065
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

если надо "спрятать" параметр функции, можно сделать внутренний блок и там объявить переменную с тем же Ирин именем, но с другим типом, не совместимым с типом переменной старой функции.

например, void*
...
Рейтинг: 0 / 0
Invalidate variable
    #39488183
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovв последующем коде вызывало ошибку компиляции?тогда только шаблонами. По аналогии с:
Код: plaintext
1.
2.
template<bool> class Assert;
template<> class Assert <true> {};



maytonА зачем это?
Удобно же. Ты ловишь ошибку на момент компиляции, а не когда уже на эксепшн наступил. И это уже дело случая, если тестами не покрыто.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Invalidate variable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]