Tôi đang viết chương trình trong đó hầu hết các chức năng thư viện được sử dụng trả lại -1 về lỗi và đặt errno. Hành vi của chương trình là như vậy mà nó thoát nếu lỗi xảy ra. Để xác định điểm xuất cảnh chính xác và lỗi từ bên ngoài chương trình (ví dụ sử dụng gdb
), tôi muốn sử dụng phương pháp sau đây:Có an toàn để giả định không phải là luôn luôn tích cực?
err = func_1(..arglist_1..);
if(err != 0)
{
perror("func(..arglist..)");
return ((1u << 8) | errno);
}
//..
//.. some more funcs
//..
err = func_n(..arglist_n..);
if(err != 0)
{
perror("func(..arglist_n..)");
return (((unsigned)n << 8) | errno);
}
Vấn đề ở đây là giả định an toàn.
Reality:errno được khai báo là extern int errno;
bên errno.h
Assumption 1: Giá trị củaerrno luôn nhỏ hơn 255.
Assumption 2:errno luôn là tích cực.
Trên cơ sở tất cả các hằng số lỗi (EAGAIN, v.v.) được xác định trong errno.h
, các giả định này là đúng hiện tại. Những điều này có thể được giả định là đúng trong tương lai không?
P .: Tôi không muốn phụ thuộc vào perror()
để xác định điểm thoát.
Tôi nghi ngờ giả định là an toàn. Đối với cái thứ hai, bạn có xem là '0' dương? – jxh
Không có '0' bị loại trừ dưới dạng [liên kết này tại đây] (http://pubs.opengroup.org/onlinepubs/009695399/functions/errno.html) nói:' Không có chức năng nào trong khối lượng IEEE Std 1003.1-2001 này phải được đặt errno to 0.' –
Chỉ vì không có hàm nào trong thư viện chuẩn đặt nó thành '0' không có nghĩa là ai đó không đặt nó thành' 0'. Đối với một số chức năng thư viện chuẩn, cách duy nhất để xác định xem cuộc gọi có thất bại hay không trước tiên đặt 'errno' thành' 0' và sau đó xem hàm nào thực hiện. – jxh