2012-10-31 27 views
11

Hãy nói rằng chúng ta có đoạn mã sau trong C (hoặc ngôn ngữ tương tự):Nếu .. số khác nhỏ hơn, không thể truy cập đang

if (x < 10) 
    do_work1(); 
else if (x < 5) 
    do_work2(); 

Will chi nhánh thứ hai của việc này có điều kiện được thực hiện trong một số trường hợp? Trình biên dịch có cảnh báo về mã không thể truy cập được không?

+0

Không, nó sẽ không được thực hiện. Hầu hết các id đều cảnh báo về mã không thể truy cập được. –

+2

Một ngôn ngữ tương tự có thể bị quá tải '>' và khiến nó làm điều bất ngờ. –

+7

Một tình huống khác tôi có thể nghĩ đến nơi nhánh thứ hai được thực hiện là nếu 'x' là biến toàn cục và bạn có một chuỗi khác có thể thay đổi giá trị của' x' ban đầu lớn hơn 10 thành giá trị nhỏ hơn 5 sau kiểm tra đầu tiên trong một hoàn cảnh không may mắn. ví dụ. 'x' là 11 lúc đầu. Thread1 làm cho phép thử đầu tiên 'if (x <10)' là false và sau đó, Thread2 thay đổi giá trị của 'x' thành 4. – halex

Trả lời

1

Nhánh thứ hai sẽ không được thực hiện và trình biên dịch không nên cảnh báo về mã không thể truy cập được.

+0

'Nhánh thứ hai sẽ không được thực hiện', Bạn có chắc chắn muốn nêu điều đó vô điều kiện không? Đoạn mã OP đó không đủ để nói chắc chắn nó sẽ không được thực thi – Mike

4
  • Nếu x là biến cục bộ thì tôi không thấy cách nào có thể thực hiện được do_work2.
  • Nếu x là biến toàn cầu hoặc được chia sẻ giữa nhiều luồng thì do_work2 có thể được thực hiện.

Không thể chứng minh nói chung là mã có thể truy cập hay không. Trình biên dịch có thể có một số quy tắc đơn giản, dễ hiểu và nhanh chóng kiểm tra có thể phát hiện các trường hợp đơn giản của mã không thể truy cập được. Không nên bao gồm hệ thống giải quyết chậm và phức tạp mà chỉ đôi khi hoạt động.

Nếu bạn muốn kiểm tra thêm, hãy sử dụng công cụ bên ngoài.

1

Không trình biên dịch sẽ không tạo bất kỳ cảnh báo nào (mã không thể truy cập được) cho mã này. loại cảnh báo này đến bình thường khi bạn sử dụng trả lại mà không có bất kỳ điều kiện nào.

như

int function(){ 

int x; 
return 0; 
x=35; 
} 

Trong trường hợp này nó sẽ cung cấp cho bạn cảnh báo.

+0

"Trình biên dịch" là gì? Một số trình biên dịch của tôi làm cảnh báo chống lại dòng thứ hai: "mã không có ảnh hưởng"/"mã không thể truy cập". Nhưng tất nhiên họ không _have_ để cảnh báo, định nghĩa của một cảnh báo là: cái gì đó rất có thể là một lỗi nhưng không vi phạm tiêu chuẩn C. – Lundin

21

Will the second branch of condition be executed in some case?

  • Vâng, nó có thể là có thể, nó phụ thuộc vào những gì khác đang xảy ra trong các mã và những gì các trình biên dịch chọn để làm với mã của bạn.

Shouldn't compiler warn about unreachable code?

  • Không, nó có thể không phải vì không có đảm bảo rằng nó không thể truy cập

Cầm lấy cái này ví dụ:

int x = 11; 

void* change_x(){ 
    while(1) 
     x = 3; 
} 

int main(void) 
{ 
    pthread_t cxt; 
    int y = 0; 
    pthread_create(&cxt, NULL, change_x, NULL); 
    while(1){ 
     if(x < 10) 
      printf("x is less than ten!\n"); 
     else if (x < 5){ 
      printf("x is less than 5!\n"); 
      exit(1); 
     } 
     else if(y == 0){ // The check for y is only in here so we don't kill 
          // ourselves reading "x is greater than 10" while waiting 
          // for the race condition 
      printf("x is greater than 10!\n"); 
      y = 1; 
     } 
     x = 11; 
    } 

    return 0; 
} 

Và kết quả:

[email protected]:~> ./a.out 
x is greater than 10! 
x is less than 5!  <-- Look, we hit the "unreachable code" 
+1

+1 cho bằng chứng runnable :) – halex

+0

@halex - Bạn đã tạo nên một điểm tuyệt vời và nó xứng đáng được minh họa. Và tôi có một vài phút rảnh rỗi :) – Mike

+6

Vắng mặt bất kỳ thuộc tính 'volatile' (đối với các trình biên dịch tiền C11) hoặc các rào cản bộ nhớ, trình biên dịch không phải lo lắng về' printf ("x nhỏ hơn 5! \ N") ; 'và thực sự sẽ tối ưu' chính() 'vào mã đối tượng mà thậm chí không chứa câu lệnh, do đó cho bạn biết số tiền mà nó quan tâm đến câu lệnh có thể truy cập được. Lý do trình biên dịch không cảnh báo là không có "không có bảo đảm nó không thể truy cập", bởi vì nó không thể truy cập cho các thực thi được định nghĩa, và trình biên dịch chỉ quan tâm đến các thực thi đã định nghĩa. –

Các vấn đề liên quan