Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Invalidate variable / 10 сообщений из 10, страница 1 из 1
12.07.2017, 18:02
    #39487782
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invalidate variable
Есть ли в С++/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
12.07.2017, 18:08
    #39487787
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invalidate variable
Dimitry Sibiryakov,

Слишком частный случай. А как быть в случае вызывающей стороны, там-то x можно будет присвоить любой переменной после вызова. Да и вообще, копий этого указателя может быть овер 9000 в разных частях кода, так что вылавливать такой частный случай смысла нет.
Но никто не запрещает тебе в GCC подключить какой-нибудь linter и в него уже наконфигать своих правил. Но это будет ооочень геморно. В LLVM с этим проще, имея полный доступ к IR коду.
...
Рейтинг: 0 / 0
12.07.2017, 18:56
    #39487818
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invalidate variable
Все уже сделано до нас ))
Код: 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
12.07.2017, 19:12
    #39487827
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invalidate variable
Dimitry Sibiryakov,

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

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

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




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

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

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



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


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