2015-07-16 18 views
11

Đây là một thử nghiệm suy nghĩ, không phải mã sản xuất cũng như kiểu mã hóa tốt.Mã C này có phải là hành vi được xác định không?

Giả sử chúng ta có chức năng này

int find_process_pid_by_name(char* name, int* threads_in_process); 

mà trả lại PID của một quá trình có tên và cũng luôn lưu trữ vào threads_in_process số lượng đề chạy trong quá trình nói.

Một lập trình viên lười biếng, chỉ quan tâm trên PID, viết mã này

int pid = find_process_pid_by_name("a process name", &pid); 

Liệu nó gây ra hành vi không xác định?

+0

Tôi đoán nếu bạn truy cập 'threads_in_process [i], i = 1,2,3..' trong hàm' find_process_pid_by_name' của bạn sẽ là hành vi không xác định! – user007

+0

Nó được xác định rõ. Như đã đề cập trong các câu trả lời, có một điểm trình tự ngay trước khi hàm quay trở lại, có nghĩa là bất kỳ tác dụng phụ nào trước đó đã xảy ra. –

+1

Nghiêm túc, bạn đang chuyển một 'const char *' thành một hàm nhận 'char *'; nếu hàm sửa đổi những gì được truyền, bạn sẽ nhận được hành vi không xác định. –

Trả lời

10

Không - Tôi không nghĩ đó là hành vi không xác định. Có một điểm chuỗi ngay lập tức trước khi hàm được gọi (sau khi các đối số và biểu thức biểu thị hàm được gọi đã được đánh giá) và có một hàm khác trước khi hàm được gọi trả về. Bất kỳ tác dụng phụ nào trên pid được thực hiện bởi hàm được gọi đã được hoàn thành trước khi hàm kết thúc trả về. Kết quả của hàm sau đó được gán cho pid. Không có câu hỏi về vị trí được gán cho thay đổi bởi hàm. Tôi thấy không có gì mà gọi hành vi không xác định.

Tôi giả định rằng hàm được gọi xử lý đối số int * dưới dạng con trỏ chỉ ghi vào một giá trị duy nhất. Nếu nó đọc từ một giá trị duy nhất, chúng ta cần biết rằng pid trước đây đã được khởi tạo (chính thức; trong thực tế, nó sẽ không quan trọng). Trong ngữ cảnh, pid chưa được khởi tạo; kết quả của hàm sẽ khởi tạo nó. Vì vậy, nếu hàm đọc từ đối số con trỏ của nó, về mặt kỹ thuật, bạn có hành vi không xác định. Nếu hàm xử lý con trỏ như là sự khởi đầu của mảng đa phần tử và truy cập vượt ra ngoài phần tử zeroth, thì có vấn đề. Nhưng đây là những vấn đề nằm ngoài phạm vi dự định của câu hỏi/thảo luận.

1

Có, tôi tin rằng mã này được xác định rõ. Có một điểm chuỗi ở cuối hàm, trước khi giá trị trả về được sao chép vào ngữ cảnh gọi. Vì vậy, chức năng đầu tiên sẽ gán cho pid gián tiếp thông qua threads_in_process, sau đó nó sẽ trở lại, và sau đó giá trị trả lại sẽ được gán cho pid.

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