Mã C ++ ngắn nhất, được hình thành tốt nhất thể hiện hành vi không xác định là gì?
Mã C ++ ngắn nhất, được hình thành tốt nhất thể hiện hành vi không xác định là gì?
Câu trả lời:
int main(){main;}
3.6.1 Hàm chính [basic.start.main]
3 - [...] Chức năng chính sẽ không được sử dụng trong một chương trình.
Chỉnh sửa: đây là chẩn đoán, vì vậy không phải là UB.
int main(){for(;;);}
1.10 Thực thi đa luồng và các cuộc đua dữ liệu [intro.multithread]
24 - Việc triển khai có thể giả định rằng bất kỳ luồng nào cuối cùng cũng sẽ thực hiện một trong các thao tác sau: - chấm dứt, - thực hiện cuộc gọi đến chức năng I / O của thư viện, - truy cập hoặc sửa đổi một đối tượng dễ bay hơi hoặc - thực hiện thao tác đồng bộ hóa hoặc hoạt động nguyên tử .
int main(){int i=i;}
4.1 Chuyển đổi Lvalue-to-rvalue [conv.lval]
1 - [...] Nếu đối tượng mà glvalue đề cập là [...] chưa được khởi tạo, một chương trình yêu cầu chuyển đổi này có hành vi chưa được thực hiện.
//^L.
Đây ^L
là ký tự nguồn cấp mẫu, là một phần của bộ ký tự cơ bản. 4 ký tự (không cần một dòng mới cho mỗi 2.2: 2). Hành vi không xác định là trên mỗi
2.8 Nhận xét [lex.comment]
1 - Nếu có một nguồn cấp dữ liệu biểu mẫu hoặc ký tự tab dọc trong
//
nhận xét [a -style], chỉ các ký tự khoảng trắng sẽ xuất hiện giữa nó và dòng mới chấm dứt nhận xét; không cần chẩn đoán.
\u\
0000
Điều này có tám ký tự và có hành vi không xác định, theo §2.2 / 1.
Mỗi phiên bản của một ký tự dấu gạch chéo ngược (
\
) ngay sau đó là một ký tự dòng mới sẽ bị xóa, nối các dòng nguồn vật lý để tạo thành các dòng nguồn logic. Chỉ dấu gạch chéo ngược cuối cùng trên bất kỳ dòng nguồn vật lý nào mới đủ điều kiện trở thành một phần của mối nối đó. Nếu, do đó, một chuỗi ký tự khớp với cú pháp của tên ký tự phổ quát được tạo ra, hành vi không được xác định.
main
.
main
. Thật khó để thực thi các quy tắc khi bạn yêu cầu một chương trình không có bất kỳ quy tắc nào phải tuân theo (đó là ý nghĩa của UB!).
main
, những gì bạn có là không đúng.
#include. /*Imagine a new-line right after the dot*/
§16.2 / 4:
Một chỉ thị tiền xử lý của mẫu
#include
pp-tokens dòng mới(không phù hợp với một trong hai hình thức trước đó) được cho phép. [..] Nếu chỉ thị dẫn đến sau tất cả các thay thế không khớp với một trong hai hình thức trước đó, thì hành vi không được xác định.
int main(){int i=1>>-1;}
Giải trình:
C ++ 98 và C ++ 11 §5.8 / 1 đều nói rằng
Hành vi không được xác định nếu toán hạng bên phải âm hoặc lớn hơn hoặc bằng độ dài tính bằng bit của toán hạng bên trái được thăng cấp.
int
thường là 32? thay đổi RHS của sự thay đổi thành -1
cùng số lượng ký tự và sẽ không phụ thuộc vào kích thước số nguyên
Nếu ai đó tin wikipedia, thì đây là một vài:
Sửa đổi chuỗi được cho là gây ra hành vi không xác định. Nó luôn làm việc cho tôi.
int main(int c,char*v){v[0]='.';}
Hàm không rỗng không có trả về gây ra các giá trị trả về không xác định.
int a(){}
int main(){return a();}
Phân chia (của int?) Bằng 0 được cho là không xác định. Tất cả những gì tôi biết là nó gặp sự cố.
int main(int c){c/0;}
int main(){}
ít nhất.
char **
không char *
. Bạn chỉ đang sửa đổi một phần của giá trị con trỏ. Trong thực tế, argv
được đảm bảo để có thể sửa đổi một cách an toàn.
char *argv[]
để không có bất kỳ const
vòng loại. Bạn có thể gặp sự cố bằng cách viết thành một chuỗi ký tự bằngint main(){char *v="";*v=1;}