Ошибка undeclared identifier avz

Обновлено: 05.07.2024

Константный член класса - не имеет права изменять состояние объекта, для которого вызван. Соответственно, может вызываться для константных объектов.

3. Почему на функцию strсpy VS 2008 ругается как на небезопасную? Пробовал заменять ее на strncpy - результат тот же.

А это очередная фишка от Microsoft. В рамках борьбы за безопасность ПО они продвигают новый набор функций для работы со строками. Например, strcpy_s

Пропущено имя параметра в последней функции:
<div >Код C++

<div > void Address::address( const char *)
std::strcpy(address_, s);
>[/code][/quote]
Чорт!

Константный член класса - не имеет права изменять состояние объекта, для которого вызван. Соответственно, может вызываться для константных объектов.

Не очень понимаю. У меня же константный указатель на элемент класса. Сам же объект не константный. Или я не прав? Что то запутался.

Спасибо за ссылку. Но вообще это бред - какая разница по результату между strncpy и strcpy_s не понятно.
Не очень понимаю. У меня же константный указатель на элемент класса. Сам же объект не константный. Или я не прав? Что то запутался.

Тут нужно все разложить четко.

Во-первых, константный указатель - это совсем не то, что указатель на константу. Есть разница в написании (для запоминания - четко читается справа налево)

Во-вторых, очевидно, что при описании результата, возвращаемого процедурой, имеет смысл только первая запись, а никак не вторая или третья.

И, наконец, при описании методов класса возможен еще один смысл спецификатора const:

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

    Файл имеет имя, идентичное системному, но находится в директории отличной от оригинального системного файла.
    [*] У файла расширение .tmp и он запускается службой или висит в автозагрузке, вообще, в 90% если это не временный файл, то вирь.
    [*] В реестре, в ветке

Есть ключи Userinit и Shell. Стандартные значения у первого ключа равно

Вирусы имеют свойство подменять эти значения или дописывать к существующим, свои пути к исполнимым файлам. Поэтому, всё что не равно настоящим значениям, можно смело удалять. В логе AVZ значения этих ключей можно увидеть в секции Автозапуск. Приведу скриншот, как это выглядит в логе. Красными линиями подчёркнуты пути ветки реестра. В этом случае рассмотрен параметр Userinit

2941a1daa4b7.jpg

fdb3cb595ef2.jpg

Поскольку файлы, в именах которых содержатся латинские символы верхнего\нижнего регистров и цифры, являются руткитами,(их не увидишь просто так), то AVZ не все их корректно отображает в логе. В этом случае, руководствуйтесь записью из лога HiJackThis, для добавления недостающих

Теперь рассмотрим параметр Shell. Как мы уже помним, стандартное значение этого ключа равно Explorer.exe. Когда значение изменено, вот так это выглядит в логе AVZ

f2e393d0effa.jpg

А вот так мы видим это в логе HiJackThis

В обеих случаях, нужно удалять те файлы, которые не являются стандартными для этих ключей.
В той же ветке реестра, есть ещё один ключ - AppInit_DLLs. Но тут не всё просто, значения этого параметра могут отсутствовать или здесь могут быть легальные .dll'ки от антивирусника или файервола, но вирусы также иногда берут в свои загребущие руки этот параметр. Тут достаточно удалить файл.

[*] Ещё можно определять вирусы по тому признаку, что ни один системный файл не будет запускаться из места, которое совершенно не предназначено для этого. Перечислю излюбленные места запуска некоторых вирусов:

Вопрос .
Если нет информации в инете как определять, что это вредная служба, например wmgcnt.sys?
_______________________
Ответ .
Если о файле нет никакой информации, то с уверенностью 99% можно полагать что это зараза, так как имя файла сгенерировано произвольно, поэтому никакой информации по нему быть не может.

Drongo

Продолжая тему определения зловредности файлов. В предыдущем ответ мы использовали пассивный поиск, основаный на некоторых характеристиках\возможностях вирусов. Сейчас мы применим активный поиск вредоносов. Сразу оговорюсь, не все вирусы можно вычислить по описуемому методу, но большинство новых, и даже не известных - точно.

Есть ли какие-нибудь 100%-ные признаки вредоносности файлов по которым можно было бы ориентироваться и удалять файл без проверки?

_______________________
Ответ.
Многие из вас знают, что вредоносные файлы в своей работе обычно "любят" использовать системные процессы, такие как services.exe, svchost.exe, explorer.exe. Как вам известно, у процессов есть свой PID - PID -это(сокращение от англ. Process ID) — идентификатор процесса, уникальный номер, который система класса назначает каждому активному процессу. Он не постоянен и при перезагрузки у процесса уже может быть другой PID. Мы используем это себе в помощь. Представим себе обычную картину, есть логи в которых некоторые зловреды используют один из перечисленных процессов, возьмём, например процесс explorer.exe, как наиболее универсальный. Открыв лог в секции Процессы мы ищем такой процесс как explorer.exe, на скриншоте мы видим этот процесс, что он прошёл по базе безопасных, тем не менее вирусы его используют. Посмотрим PID проводника, его PID = 1776. Запомним его крепко - 1776.

db92d2bee51f.jpg


Запомним несколько ключевых моментов, по которым мы будем определять зловредность файлов.

Компилятору не удается найти объявление идентификатора. Эта ошибка имеет несколько возможных причин. Наиболее распространенными причинами C2065 является то, что идентификатор не был объявлен, идентификатор написан неправильно, заголовок, где объявляется идентификатор, не включается в файл, или в идентификаторе отсутствует квалификатор области, например, cout вместо std::cout . Дополнительные сведения об объявлениях в C++ см. в разделе объявления и определения (c++).

Ниже приведены некоторые распространенные проблемы и более подробные решения.

Идентификатор не объявлен

Если идентификатор является переменной или именем функции, его необходимо объявить перед тем, как его можно будет использовать. Перед использованием функции в объявлении функции также должны быть включены типы его параметров. Если переменная объявлена с помощью auto , компилятор должен иметь возможность определить тип из его инициализатора.

Если идентификатор является членом класса или структуры или объявлен в пространстве имен, он должен уточняться именем класса или структуры или именем пространства имен при использовании вне структуры, класса или области пространства имен. Кроме того, пространство имен должно быть помещено в область с помощью using директивы, такой как using namespace std; , или имя члена должно быть помещено в область с помощью using объявления, такого как using std::string; . В противном случае неполное имя считается необъявленным идентификатором в текущей области.

Если идентификатор является тегом для определяемого пользователем типа, например, class или struct , тип тега должен быть объявлен до его использования. Например, объявление struct SomeStruct < /*. */ >; должно существовать, прежде чем можно будет объявить переменную SomeStruct myStruct; в коде.

Если идентификатор является псевдонимом типа, тип должен быть объявлен с помощью using объявления или typedef перед тем, как его можно будет использовать. Например, необходимо объявить, using my_flags = std::ios_base::fmtflags; прежде чем можно будет использовать my_flags в качестве псевдонима типа для std::ios_base::fmtflags .

Пример: идентификатор с ошибками

Эта ошибка обычно возникает, когда имя идентификатора написано неправильно или идентификатор использует неправильные прописные и строчные буквы. Имя в объявлении должно точно совпадать с именем, которое вы используете.

Пример. Использование неограниченного идентификатора

Эта ошибка может возникать, если идентификатор не является правильно заданной областью. Если вы видите C2065 при использовании cout , это является причиной. Если функции и операторы стандартной библиотеки C++ не полностью определены в пространстве имен или вы не передали std пространство имен в текущую область с помощью using директивы, компилятор не сможет их найти. Чтобы устранить эту проблему, необходимо либо полностью определить имена идентификаторов, либо указать пространство имен с помощью using директивы.

Этот пример не компилируется cout , поскольку и endl определены в std пространстве имен:

Идентификаторы, объявляемые внутри class типов, struct или, enum class также должны уточняться именем их включающей области при их использовании за пределами этой области.

Пример: предварительно скомпилированный заголовок не является первым

Этот пример не компилируется cout , поскольку и endl определены в <iostream> заголовке, который игнорируется, поскольку он включается перед предкомпилированным файлом заголовка. Чтобы выполнить сборку этого примера, создайте все три файла, а затем скомпилируйте файл stdafx. cpp, а затем скомпилируйте C2065_pch. cpp.

Пример: отсутствует заголовочный файл

Вы не включили заголовочный файл, объявляющий идентификатор. Убедитесь, что файл, содержащий объявление идентификатора, включен в каждый исходный файл, который его использует.

Другая возможная причина заключается в том, что при использовании списка инициализаторов не включается <initializer_list> заголовок.

эта ошибка может возникать в исходных файлах Windows классических приложений, если вы определяете VC_EXTRALEAN , WIN32_LEAN_AND_MEAN или WIN32_EXTRA_LEAN . Эти макросы препроцессора исключают некоторые файлы заголовков из Windows. h и афксв _ W32. h для ускорения компиляции. Просмотрите Windows. h и afxv_w32. h, чтобы получить последние сведения о том, что исключено.

Пример: отсутствует закрывающая кавычка

Эта ошибка может возникать, если отсутствует закрывающая кавычка после строковой константы. Это простой способ запутывания компилятора. Обратите внимание, что пропущенная закрывающая кавычка может быть в нескольких строках перед сообщаемым расположением ошибки.

Пример. Использование итератора вне области действия цикла

Эта ошибка может возникать, если объявить переменную-итератор в for цикле, а затем попробовать использовать эту переменную итератора вне области for цикла. Компилятор включает параметр компилятора /Zc: forScope по умолчанию. Дополнительные сведения см. в разделе Поддержка итераторов отладки .

Пример: объявление удаленного препроцессора

Эта ошибка может возникать, если вы ссылаетесь на функцию или переменную, которая находится в коде, скомпилированном по условию, который не компилируется для текущей конфигурации. Это также может произойти при вызове функции в файле заголовка, который в настоящее время не поддерживается в среде сборки. Если определенные переменные или функции доступны только при определении конкретного макроса препроцессора, убедитесь, что код, вызывающий эти функции, может быть скомпилирован только при определении одного и того же макроса препроцессора. Эту ошибку легко выявить в интегрированной среде разработки, так как объявление функции недоступно, если требуемые макросы препроцессора не определены для текущей конфигурации сборки.

Это пример кода, который работает при сборке в отладке, но не в розницу:

Пример: сбой выведения типа C++/CLI

Эта ошибка может возникать при вызове универсальной функции, если аргумент предполагаемого типа не может быть выведен из используемых параметров. Дополнительные сведения см. в разделе универсальные функции (C++/CLI).

Пример: параметры атрибута C++/CLI

эта ошибка также может быть вызвана работой по согласованности компилятора, выполненной для Visual Studio 2005: проверка параметров для Visual C++ных атрибутов.

Была у меня прога (хотя исходный текст ее писал не я -- я только как начинающий развиваю ее), в которой есть модуль MainFormUnit примерно такой структуры:

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

procedure TMainForm.Button2Click(Sender:TObject);
begin
Main_cycle("",false);
end;

procedure TMainForm.Button1Click(Sender:TObject);
begin
.
Main_cycle("abc",true);
end;

procedure Main_cycle(. );
begin
.
(основной цикл)
.
end;
end.

и теперь при попытке компиляции выводится следующая ругань:

Undeclared identifier: "Button2"
Undeclared identifier: "Button4"
Undeclared identifier: "ComboBox2"
.

"после" - понятие растяжимое

Послушай Мастеров. Попробую объяснить простым языком.

Проблема в том, что Твои собственные процедуры и функции НИКАК НЕ ПРИВЯЗАНЫ к форме, поэтому даже в пределах юнита, в котором объявлена эта форма они не могут использовать напрямую элементы этой формы ( кнопки, боксы и прочее ). Вариантов выхода 2 :

1. Объявить Твою процедуру или функцию в PRIVATE секции объявления формы
2. При написании кода везде использовать ПОЛНЫЕ имена элементов - с привязкой к имени формы, на которой они находятся
Имя_формы.Имя_элемента()

Приведи пожалуйста следующие куски кода :
1. Объявление Твоей формы ( полностью ).
2. Объявление процедуры, в которой происходят ошибки.
3. Строки кода, где происходит обращение к элементам формы.

А вот объявление формы:

А вот сами процедуры:

procedure TMainForm.Button2Click(Sender:TObject);
begin
Main_cycle("",false);
end;

Когда я высшее образование получал (1991), AFAIK никакого Delphi еще в природе не существовало. А заняться ими мне пришлось все три мясяца как.

При таком объявлении процедура Main_Cycle становится не просто процедурой, а методом класса TMainForm. Поэтому внутри нее становятся напрямую доступны все компоненты, лежащие на этой форме. Что Вам и требовалось.

Кстати, объявлять ее можно не обязательно в private. Зависит от того, какую Вы хотите иметь для нее область видимости.

Читайте также: