혼합 권장 규칙 규칙 집합
이러한 Microsoft Mixed Recommended 규칙은 잠재적 보안 허점, 응용 프로그램 충돌 및 기타 중요한 논리 및 디자인 오류를 포함하여 공용 언어 런타임을 지원하는 C++ 프로젝트의 가장 일반적으로 중요한 문제에 초점을 맞춥니다.공용 언어 런타임을 지원하는 C++ 프로젝트에 대해 만드는 모든 사용자 지정 규칙 집합에 이 규칙 집합을 포함해야 합니다.이 규칙 집합은 Visual Studio Professional 이상 버전에서 구성하도록 디자인되었습니다.
규칙 |
설명 |
---|---|
초기화되지 않은 메모리 사용 |
|
Null 포인터 역참조 |
|
확인되지 않은 값 사용 |
|
반환 값이 무시되었습니다. |
|
호출의 0 종료 |
|
0 종료 없음 |
|
잘못된 연결 |
|
Format 함수에 문자열 인수 없음 |
|
Format 함수에 정수 인수 없음 |
|
Format 함수에 포인터 인수 없음 |
|
Format 함수에 문자열 포인터 인수 없음 |
|
초기화되지 않은 메모리 반환 중입니다. |
|
인덱스가 버퍼 최대값을 초과함 |
|
인덱스가 스택 버퍼 최대값을 초과함 |
|
BOOL에 대한 잘못된 캐스팅 HRESULT |
|
BOOL에 대한 잘못된 캐스팅 HRESULT |
|
HRESULT에 대한 잘못된 컴파일러 삽입 캐스팅 BOOL |
|
NOT을 포함하는 잘못된 HRESULT 테스트 |
|
1과 비교할 때 잘못된 HRESULT |
|
1에 대한 잘못된 HRESULT 할당 |
|
HRESULT를 부울로 잘못 사용 |
|
논리합의 0이 아닌 상수 |
|
논리합의 0이 아닌 상수 |
|
논리적으로 0에 대한-부작용을 잃습니다. |
|
강제 로컬 해제 |
|
Null DACL 작성 |
|
해제되지 않은 주소 설명자 |
|
보호되지 않은 Alloca 사용 |
|
스레드 종료를 사용 |
|
비트 OR 제한 스위치에 데드 코드가 있음 |
|
바이트 산술 사용 |
|
과도한 스택 사용 |
|
루프에 Alloca 사용 |
|
캐스팅에 괄호 없음 |
|
포인터 역참조 무시됨 |
|
Format 함수에 부동 인수 없음 |
|
Format 함수의 추가 인수 |
|
Format 함수의 비부동 인수 |
|
Format 함수의 비정수 인수 |
|
Format 함수의 비문자 인수 |
|
잘못된 문자열 캐스팅 |
|
잘못된 CreateProcess 호출 |
|
배열-새 스칼라-삭제 불일치 |
|
배열-새 스칼라-삭제 불일치 |
|
메모리 할당-할당 해제 불일치 |
|
비트 관계 우선 순위 |
|
할당에서 테스트 교체 |
|
기본 배열-새 스칼라-삭제 불일치 |
|
Format 함수의 개체 인수 잘못됨 |
|
상수의 논리합 |
|
논리합이 0이 아니므로 의도하지 않은 결과 발생 |
|
중복 테스트 |
|
논리로 상호를 포하고-False 입니다. |
|
논리합에 대한 상호 제외가 true임 |
|
비트 논리 부정-및 우선 순위 |
|
비트 논리 부정-또는 우선 순위 |
|
루프가 최대값부터 위로 계산됨 |
|
루프가 최소값부터 아래로 계산됨 |
|
루프 본문이 실행되지 않음 |
|
무한 루프 |
|
루프가 한 번만 실행됨 |
|
더 큰 크기로의 시프트 캐스팅 결과 |
|
부울 비교에 대한 비트 필드 |
|
Format 함수에 대한 잘못된 문자열 인수 |
|
Format 함수에 대한 잘못된 와이드 문자열 인수 |
|
크기 및 개수 사용 불일치 |
|
잘못된 변수 인수 함수 호출 |
|
Realloc 누수 |
|
잘못된 예외 필터 상수 |
|
예외 실행 루프 계속 |
|
비트 OR 우선 순위 |
|
하지 하지 보수 |
|
예외 계속 검색 |
|
쉼표로 무시됨 |
|
문자열 비교 대신 문자열 복사 |
|
잠재적 인수 형식 불일치 |
|
VirtualFree 플래그 잘못됨 |
|
VirtualFree 매개 변수 잘못됨 |
|
VirtualFree 크기 잘못됨 |
|
프로세스 핸들 누수 |
|
종료 정보 없음 |
|
Element-Count Byte-Count 버퍼 오버런 |
|
포인터 크기 분할 |
|
읽기 오버런 |
|
쓰기 오버런 |
|
잘못된 매개 변수 값 |
|
잘못된 매개 변수 값 |
|
잘못된 특성 속성 |
|
특성 속성 값 충돌 |
|
참조는 Null일 수 없음 |
|
비포인터에 대한 Null |
|
Void에 대한 MustCheck |
|
비포인터 또는 배열에 대한 버퍼 크기 |
|
Null은 역참조 0에서 불일치 |
|
상수에 대한 쓰기 액세스 |
|
사전 조건에서 반환이 사용됨 |
|
비포인터에 대한 Null 종료 |
|
MustCheck는 Yes 또는 No여야 함 |
|
버퍼 크기가 없는 요소 크기 |
|
버퍼 크기가 배열 크기를 초과함 |
|
비포인터에 대한 버퍼 크기 |
|
특성에 대한 속성 없음 |
|
읽기 불가능 버퍼에 대한 유효 크기 |
|
쓰기 불가능 버퍼에 대한 쓰기 가능 크기 |
|
주석이 잘못 되었습니다: 'NeedsRelease' 속성의 값이 예 또는 아니요이어야 합니다. |
|
역참조 문자열 크기가 잘못 되었습니다. |
|
잘못된 크기 문자열 형식 |
|
문자열 매개 변수의 크기가 잘못 되었습니다. |
|
잘못된 크기 문자열 접근할 수 없는 위치 |
|
잘못된 크기를 문자열 버퍼 형식입니다. |
|
경고 C6527: 주석이 잘못되었습니다. NeedsRelease 속성은 void 형식의 값에 사용할 수 없습니다. |
|
인식할 수 없는 형식 문자열 스타일 |
|
이 함수에 특성 주석을 사용하면 기존의 모든 주석이 무효화됩니다. |
|
크기 사양이 잘못되었습니다. 식을 구문 분석할 수 없습니다. |
|
Deref= 또는 Notref=가 잘못되었습니다. 식을 구문 분석할 수 없습니다. |
|
값이 올바른 Yes/No/Maybe 값이 아닙니다. |
|
값이 문자열 값이 아닙니다. |
|
값이 숫자가 아닙니다. |
|
예기치 않은 주석 식 오류가 발생했습니다. |
|
주석 인수 개수가 예상 된 주석에 대한 인수의 실제 수가 맞지 않습니다. |
|
주석에 대해 예기치 않은 주석 오류가 발생했습니다. |
|
XML 로그 파일을 저장하지 못했습니다. |
|
경합 상태(race condition). |
|
연관 작업을 적절하게 사용할 수 없습니다. |
|
호출자가 잠금 유지에 실패했습니다. |
|
호출자가 잠금 해제에 실패했습니다. |
|
호출자가 잠금을 유지할 수 없습니다. |
|
잠금 해제에 실패했습니다. |
|
잠금 획득 또는 유지에 실패했습니다. |
|
유지되지 않은 잠금을 해제합니다. |
|
SAL 주석 동시성 오류 |
|
이 식은 이 호출에 대해 True가 아닙니다. |
|
주석이 추가된 매개 변수는 포인터여야 합니다. |
|
이 함수의 함수 클래스(들)은 함수를 정의하는 데 사용된 typedef의 함수 클래스(들)와 일치하지 않습니다. |
|
할당 중이거나 전달 중인 함수는 하나 이상의 클래스에 대한 함수 클래스 주석을 갖고 있어야만 합니다. |
|
할당 중인 함수 포인터에 함수 클래스(들)로 주석이 추가되었는데 이 클래스는 함수 클래스(들) 목록에 포함되지 않습니다. |
|
실제 매개 변수의 형식은 형식과 정확히 일치해야 합니다. |
|
Interlocked 함수를 통해 액세스되는 변수는 항상 Interlocked 함수를 통해 액세스해야 합니다. |
|
interlocked 함수를 통해 로컬 변수에 액세스합니다. |
|
함수는 try/except 블록 내에서 호출해야 합니다. |
|
변수 인수가 대신 (리터럴) 상수여야 합니다. |
|
그 대신 상수 인수는 변수여야 합니다. |
|
다른 함수를 대신 사용하십시오. |
|
Error 주석 |
|
함수를 try/except 블록 내에서 호출할 수 없습니다. |
|
인수가 포인터에 대한 포인터가 아니라 개체에 대한 포인터가 필요한 함수로 전달되고 있습니다. |
|
NULL 포인터를 역참조하고 있습니다.다른 포인터와 포인터가 NULL 값을 포함 합니다. |
|
인수의 값은 하나일 수 있으며 포인터에서 찾은 값의 복사본입니다. |
|
변수가 검사해야 하는 값을 보유하고 있습니다. |
|
충족하지 않은 요구 사항입니다. (이 식은 true가 아닙니다.) |
|
비정적 멤버에 대한 잘못된 참조입니다. |
|
클래스 멤버에 대한 모호한 참조입니다. |
|
_Success_ 또는 _On_failure_가 잘못된 컨텍스트에서 사용되었습니다. |
|
'->': 왼쪽 피연산자가 구조체를 가리킵니다. |
|
왼쪽 피연산자가 구조체를 가리킵니다. '.'를 사용하십시오. |
|
기호의 선언에 충돌하는 선언이 있습니다. |
|
_On_failure_ 컨텍스트에 대한 주석이 명시적 사전 컨텍스트에 없어야 합니다. |
|
SAL_context에 대해 정적 컨텍스트 이름이 필요합니다. |
|
주석에 대한 포인터 식이 있어야 합니다. |
|
이전 선언을 수정하지 않고 참조하려면 _Use_decl_annotations_ 주석을 사용해야 합니다. |
|
특성 매개 변수 이름은 p1...p9여야 합니다. |
|
이미 typefix가 있는 매개 변수에 typefix를 적용할 수 없습니다. |
|
주석은 특정 함수 매개 변수에 대한 사전 조건에만 적용됩니다. |
|
함수의 경우 주석에 대한 매개 변수 개수가 파일에 있는 개수와 일치하지 않습니다. |
|
함수에 대해 매개 변수의 경우 주석 매개 변수 개수가 파일에 있는 개수와 일치하지 않습니다. |
|
주석에 있는 매개 변수 주석에 열거의 멤버가 필요합니다. |
|
주석에 있는 매개 변수 주석에 정수 식이 필요합니다. |
|
주석에 있는 매개 변수에 문자열 식이 필요합니다. |
|
주석에 __yes, __no 또는 __maybe가 필요합니다. |
|
주석, 매개 변수에 대해 토큰/식별자가 필요한데 없습니다. |
|
주석에 매개 변수가 필요합니다. |
|
주석에서 필요한 수의 매개 변수를 찾을 수 없습니다. |
|
또한 주석은 현재 선언에서 PrimOp일 수 없습니다. |
|
또한 주석은 PrimOp일 수 없습니다(이전 선언 참조). |
|
주석 매개 변수: 주석에서 형식을 사용할 수 없습니다. |
|
주석에서 매개 변수를 지원하지 않습니다. |
|
매개 변수 형식에 멤버가 없습니다. |
|
주석은 배열에서만 유효합니다. |
|
Pre, post 또는 deref가 주석에 적용되지 않았습니다. |
|
Pre, post 또는 deref가 블록에 적용되었습니다. |
|
__at_ 식이 현재 함수에 적용되지 않습니다. |
|
함수는 단독으로 주석으로 사용할 수 없습니다. |
|
주석은 식에서 사용할 수 없습니다. |
|
매개 변수의 주석은 더 이상 지원되지 않습니다. |
|
매개 변수의 주석에 value, stringValue 및 longValue가 두 개 이상 있습니다.paramn=xxx를 사용하십시오. |
|
경고 28239: 매개 변수의 주석에 value, stringValue 또는 longValue와 paramn=xxx가 모두 있습니다.paramn=xxx만 사용하십시오. |
|
매개 변수의 주석에 param2는 있는데 param1이 없습니다. |
|
매개 변수의 함수에 대한 주석을 인식할 수 없습니다. |
|
매개 변수의 함수에 대한 주석에 실제 형식 주석이 허용하는 것보다 많은 역참조가 필요합니다. |
|
함수에 대한 주석에 구문 분석할 수 없는 매개 변수/외부 주석이 있습니다. |
|
함수에 대한 주석에서 멤버가 아닌 함수에 'this'를 주석으로 추가합니다. |
|
함수 매개 변수에 주석을 매개 변수 형식이 일치 하지 않습니다. |
|
함수에 대한 주석이 일치하지 않습니다. 이전 인스턴스에 오류가 있습니다. |
|
함수에 대한 주석이 일치하지 않습니다. 이 인스턴스에 오류가 있습니다. |
|
경고 C28253: 함수에 대한 주석이 일치하지 않습니다. 매개 변수의 이 인스턴스에 다른 주석이 있습니다. |
|
경고 C28253: 함수에 대한 주석이 일치하지 않습니다. 매개 변수의 이 인스턴스에 다른 주석이 있습니다. |
|
dynamic_cast<>()는 주석에서 지원되지 않습니다. |
|
함수에 주석에 대한 주석 구문 오류가 있습니다. |
|
내장 주석에 대한 조건부 주석에 구문 오류가 있습니다. |
|
결과 목록 값은 상수여야 합니다. |
|
함수에 주석에 대한 주석 구문 오류가 있습니다. |
|
함수, 매개 변수에 대한 주석이 검사 시 함수 선언과 일치하지 않습니다. |
|
함수의 암시가 함수 선언과 일치하지 않습니다. |
|
_Macro_value_에 대한 매개 변수가 null입니다. |
|
기호의 경우 일치하는 'end'가 없는 'begin'이 있습니다. |
|
기호의 경우 일치하는 'begin'이 없는 'end'가 있습니다. |
|
형식 문자열이 사전 조건에 있어야 합니다. |
|
함수의 경우 매개 변수에 구문 오류가 있습니다. |
|
함수의 경우 끝에 구문 오류가 있습니다. |
|
함수의 경우 _At_() 주석에 구문 오류가 있습니다(인식할 수 없는 매개 변수 이름). |
|
함수의 경우 _At_() 주석에 구문 오류가 있습니다(잘못된 매개 변수 이름). |
|
함수의 경우: ReadableTo 또는 WritableTo에 limit-spec가 매개 변수로 포함되지 않았습니다. |
|
함수에 대한 주석에 실제 매개 변수 개수보다 많은 외부 참조가 있습니다. |
|
게시물에 null/notnull deref 수준 0은 함수에 대한 의미가 없습니다. |
|
연산자에 대한 호환되지 않는 형식의 식 피연산자입니다. |
|
함수의 첫 번째 선언에 대한 주석이 없습니다. |
|
주석에 추가 _Deref_ 연산자가 있습니다. |
|
주석에 모호한 _Deref_ 연산자가 있습니다. |
|
토큰에 부적절하게 배치된 _Notref_ 연산자가 적용되었습니다. |
|
token을(를) 구문 분석하는 동안 오류가 발생했습니다. |
|
매개 변수의 주석이 사용되지 않습니다. |
|
매개 변수의 주석이 사용되지 않습니다. |
|
주석이 조건부로 적용할 수 없는 상황을 설명합니다. |
|
주석은 동적 값(변수)을 조건에 사용할 수 없는 위치를 설명합니다. |
|
삭제 가능한 필드가 있는 형식은 삭제 가능해야 합니다. |
|
이벤트 처리기를 제대로 선언하십시오. |
|
AssemblyVersionAttribute로 어셈블리 표시 |
|
인터페이스 메서드는 자식 형식에서 호출할 수 있어야 합니다. |
|
네이티브 리소스가 있는 형식은 삭제 가능해야 합니다. |
|
P/Invoke를 NativeMethods 클래스로 이동 |
|
기본 클래스 메서드를 숨기지 마십시오. |
|
IDisposable을 올바르게 구현하십시오. |
|
예기치 않은 위치에서 예외를 발생시키지 마십시오. |
|
중복 액셀러레이터 키를 사용하지 마십시오. |
|
P/Invoke 진입점이 있어야 합니다. |
|
P/Invoke는 노출되지 않아야 합니다. |
|
자동 레이아웃 형식은 COM 노출이면 안 됩니다. |
|
P/Invoke 다음에 바로 GetLastError를 호출하십시오. |
|
COM 노출 형식의 기본 형식은 COM 노출이어야 합니다. |
|
COM 등록 메서드는 일치해야 합니다. |
|
P/Invoke를 올바르게 선언하십시오. |
|
빈 종료자를 제거하십시오. |
|
값 형식 필드는 이식 가능해야 합니다. |
|
P/Invoke 선언은 이식 가능해야 합니다. |
|
약한 ID를 가진 개체를 잠그지 마십시오. |
|
보안상 취약한 부분이 있는지 SQL 쿼리를 검토하십시오. |
|
P/Invoke 문자열 인수에 대해 마샬링을 지정하십시오. |
|
값 형식에서 선언적 보안을 검토하십시오. |
|
포인터는 노출되면 안 됩니다. |
|
보안 형식은 필드를 노출하면 안 됩니다. |
|
메서드 보안은 형식의 상위 집합이어야 합니다. |
|
APTCA 메서드는 APTCA 메서드만 호출해야 합니다. |
|
APTCA 형식은 APTCA 기본 형식만 확장해야 합니다. |
|
링크 요청이 있는 메서드를 간접적으로 노출하지 마십시오. |
|
재정의 링크 요청은 기본 형식의 링크 요청과 같아야 합니다. |
|
취약한 finally 절을 외부 try에 래핑하십시오. |
|
형식 링크 요청에는 상속 요청이 필요합니다. |
|
보안에 중요한 형식은 형식 등가에 참여할 수 없습니다. |
|
기본 생성자는 기본 형식의 기본 생성자 이상으로 중요해야 합니다. |
|
대리인은 투명도가 일관된 메서드에 바인딩해야 합니다. |
|
메서드는 기본 메서드를 재정의할 때 일관성 있는 방식을 유지해야 합니다. |
|
투명한 메서드는 안정형 IL만 포함해야 합니다. |
|
투명한 메서드는 SuppressUnmanagedCodeSecurity 특성을 가진 메서드를 호출해서는 안 됩니다. |
|
투명 코드는 보안에 중요한 항목을 참조해서는 안 됩니다. |
|
투명한 메서드는 LinkDemands를 충족해서는 안 됩니다 |
|
형식은 기본 형식 및 인터페이스 이상으로 중요해야 합니다. |
|
투명 메서드는 보안 어설션을 사용할 수 없습니다. |
|
투명한 메서드는 네이티브 코드를 호출해서는 안 됩니다. |
|
스택 정보를 유지하도록 다시 throw하십시오. |
|
개체를 여러 번 삭제하지 마십시오. |
|
값 형식 정적 필드를 인라인으로 초기화하십시오. |
|
서비스 구성 요소를 WebMethod를 사용하여 표시하지 마십시오. |
|
삭제 가능한 필드는 삭제해야 합니다. |
|
재정의 가능한 메서드를 생성자에서 호출하지 마십시오. |
|
삭제 가능한 형식은 종료자를 선언해야 합니다. |
|
종료자는 기본 클래스 종료자를 호출해야 합니다. |
|
serialization 생성자를 구현하십시오. |
|
ValueType.Equals를 재정의할 때 같음 연산자를 오버로드하십시오. |
|
Windows Forms 진입점을 STAThread를 사용하여 표시하십시오. |
|
모두 serialize할 수 없는 필드로 표시하십시오. |
|
ISerializable 형식에서 기본 클래스 메서드를 호출하십시오. |
|
ISerializable 형식을 SerializableAttribute로 표시하십시오. |
|
serialization 메서드를 올바르게 구현하십시오. |
|
ISerializable을 올바르게 구현하십시오. |
|
형식 메서드에 올바른 인수를 제공하십시오. |
|
NaN에 대해 정확하게 테스트하십시오. |