본문 바로가기

프로그램 실행 시 잘못된 인수가 발견되었습니다. 오류 원인

노랗 2024. 6. 19.
반응형

프로그램 실행 시 잘못된 인수가 발견되었습니다. 오류 원인

"잘못된 인수가 발견되었습니다"라는 오류 메시지는 주로 MFC(Microsoft Foundation Classes) 프레임워크에서 발생하지만, 존재하지 않는 리소스에 접근하는 경우나 다른 상황에서도 발생할 수 있습니다. 이 오류를 해결하는 과정과 주요 발생 상황들을 아래와 같이 정리할 수 있습니다.

"잘못된 인수가 발견되었습니다"라는 오류 메시지는 프로그램에서 함수를 호출할 때 전달된 인수의 값이 유효하지 않거나 예상치 못한 형식이거나 범위를 벗어나는 경우에 발생합니다. 주로 MFC 프레임워크에서 발생하지만, 다른 상황에서도 나타날 수 있습니다.

  1. 코드 검토: 해당 오류 메시지가 발생한 코드 부분을 주의 깊게 검토합니다.
  2. 함수 호출 확인: 함수 호출 시 전달되는 인수들이 해당 함수에서 요구하는 조건을 충족하는지 확인합니다.
  3. 디버깅 도구 활용: 주로 디버깅 도구를 사용하여 코드를 실행하면서 문제가 발생하는 지점을 찾아내는 것이 도움이 됩니다.

잘못된 인수가 발견되었습니다. 오류 발생 상황 파악

  1. 함수에 전달된 매개변수의 형식 오류: 함수가 특정한 형식의 매개변수를 요구하는데, 그에 맞지 않는 형식으로 값을 전달한 경우.
  2. 배열 범위를 벗어난 접근: 배열의 인덱스가 배열의 크기를 벗어나는 경우.
  3. 잘못된 타입의 포인터 사용: 함수에 필요한 포인터의 타입과 실제 전달된 포인터의 타입이 일치하지 않는 경우.
  4. 존재하지 않는 리소스에 접근: 파일, 메모리 등의 리소스에 접근할 때 해당 리소스가 존재하지 않는 경우.
  5. 라이브러리 함수 호출 시 인수 오류: 특정 라이브러리 함수를 호출할 때, 해당 함수에서 예상한 형식과 다른 인수를 전달한 경우.

저의 경우 윈도우에서 설치된 프로그램을 실행 시 잘못된 인수가 발견되었습니다 오류가 실행되었으며 프로그램은 정상적으로 동작하지만, 오류 메시지만 나타나는 상황이였습니다.

우선 의심되는 상황 및 코드 찾아 문제를 해결해 봤습니다.

배열 범위를 벗어났을 때 발생하는 것으로 보이는데, 이를 해결하기 위해 strcpy, memcpy 함수 등을 검토했으나 문제 해결에 도움이 되지 않았기 때문에 MakeLower() 또는 MakeUpper() 함수에서 특수기호가 있는 문자열을 처리할 때 예외가 발생했습니다.

문제원인 찾기

특히, MakeLower()와 MakeUpper() 함수에서 예외가 발생하는데, 이 함수들은 대소문자 변환을 수행합니다.

특수기호가 있는 문자열에서 이러한 함수를 사용할 때 문제가 발생할 수 있기 때문에 예제 코드에서 CStringA 클래스를 사용하고 있으며, 이것이 예외를 발생시키는 것으로 확인되었습니다.

char szMsg[256] = {0, };
BYTE byteData[256] = {0, };

for(int i = 0; i < 255; i++)
    byteData[i] = i + 1;

memcpy(szMsg, byteData, 255);
CStringA strMsg = szMsg;

// 예외가 발생하는 부분
try {
    strMsg.MakeLower(); // 특수 기호가 있는 문자열에서 예외 발생
}
catch (CException* e) {
    // 예외 처리 코드
}

 

특수기호가 있는 문자열에서 대소문자 변환이 필요한 경우, 다른 방법을 고려해야 합니다. 예를 들어, 직접 반복문을 사용하여 대소문자를 변환하거나, 필요한 경우에만 변환하도록 수정할 수 있으며 예외가 발생하는 부분을 try-catch 문으로 묶어서 예외 처리를 하면서 디버깅을 진행하면 문제의 근본 원인을 빠르게 찾을 수 있습니다.

그 외에도 IP 또는 해당 포트가 없을 때 발생할 수 있다는 언급이 있었습니다. 해당 부분도 주의 깊게 검토할 필요가 있으며 MFC Code에서 CCommandLineInfo::FileOpen과 관련된 부분도 문제의 원인이 될 수 있습니다.

마지막으로 파일 이름에 특정 문자가 들어가는 경우 에러가 발생하는 것으로 확인됐기 때문에 프로그램의 설치 및 실행경로도 다시 한번 확인해봅니다.고 향후 발생할 수 있는 유사한 문제를 방지할 수 있을 것입니다.

반응형

댓글