여기서 무엇이 문제일까요?

uecoyk의 이미지

vr_id는 0인데, 항상 아래의 if 조건문에 걸려서
"Invalid vr_id = 0" 을 출력하고 빠져나옵니다.
0이면 조건 문에 걸릴 수 가 없는 상황 인데 걸리는 이유가 뭘까요?

#define LAM_MAX_VR_COUNT 1
 
int
lam_nl_init (struct lib_globals* zg, int vr_id)
{
    unsigned long groups;
    int ret;
    FUNC_ENTER;
    groups = RTMGRP_LINK|RTMGRP_IPV4_ROUTE|RTMGRP_IPV4_IFADDR|RTMGRP_NEIGH;
 
    FUNC_PRINT("Input vr_id = %d\n", vr_id);
    if ( (vr_id < 0) || (vr_id >= LAM_MAX_VR_COUNT) )
    {
      FUNC_PRINT("Invalid vr_id = %d\n", vr_id);
      FUNC_EXIT;
      return LAM_ERROR;
    }
익명 사용자의 이미지

해당 코드만 봐서는 문제가 없어보이는데요...
fork되어서 다른 쓰레드에서 vr_id를 쓴다든가..? 전체코드가 있어야 판단 가능할것 같아요.

mirheekl의 이미지

#include <stdio.h>
#define LAM_MAX_VR_COUNT 1
 
int lam_nl_init(int vr_id)
{
    unsigned long groups;
    int ret = 0;
 
    printf("Input vr_id = %d\n", vr_id);
    if ( (vr_id < 0) || (vr_id >= LAM_MAX_VR_COUNT) )
    {
      printf("Invalid vr_id = %d\n", vr_id);
      return 0;
    }
    return ret;
}
 
void main(void)
{
    lam_nl_init(0);
}

Input vr_id = 0 라고 잘 찍혀 나옵니다. 따라서 0을 에러로 뿌린다는 것은 첫번째 printf수행후 어디선가 다른 녀석이 vr_id를 변경했다가 비교문 진입 후에 되돌려놨다는 얘기죠. 아니면 우측 비교 상수 부분이 어디서 침범을 받든지.. 컴파일러 특성 문제로 if문의 문법이 조금 다르다든지. 말도 안되는 것 같지만 뭐 특수한 환경이면 뭐 어떤 일도 일어날 수 있으니까요. 개인적으로 결과가 궁금해집니다.

--

uecoyk의 이미지


첫번째 조건에서 걸린건 아닌 거 같고,
macro로 선언해 놓은 녀석이 long으로 잡혀서 vr_id가 long으로 잡힌게 아닐까 의심을 하고 있습니다...

코드는 if(vr_id !=0) 으로 수정을 했구요...

이런 경우는 참.......
.....

익명 사용자의 이미지

sizeof(LAM_MAX_VR_COUNT), sizeof(vr_id) 해보니 전부 4바이트로 나오는거 보니 int가 맞는거 같구요..

이 코드가 아닌, 다른 곳에서 분명히 간섭이 있을 것 같아요..