1
_CRT_SECURE_NO_WARNINGS trong Visual Studio C/C++ là gì? Nó có quan trọng không?
1
Việt Cuponi70 đã đăng:

Cho mình hỏi mục đích của _CRT_SECURE_NO_WARNINGS trong Visual Studio là gì? Trong các phiên bản VS 2012 trở về trước, nó chỉ cảnh báo rằng không nên sử dụng hàm scanf, fscanf, ...v.v nhưng trong VS 2017 thì lại báo lỗi luôn và không thể thực thi chương trình.

'fscanf': This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Nếu mình thêm dòng

#define _CRT_SECURE_NO_DEPRECATE

hoặc

#pragma warning(disable:4996)

thì mọi thứ trở lại bình thường, mình có cần phải để ý tới chuyện này không hay mặc định bỏ qua?

thêm bình luận...
1
NOTHING50 đã đăng:

_CRT_SECURE_NO_WARNINGS là gì?

_CRT_SECURE_NO_WARNINGS trong Visual Studio C/C++ chỉ là một cảnh báo hoặc báo lỗi của riêng trình biên dịch Visual Studio với hàm ý muốn nói với bạn rằng các hàm đọc dữ liệu như scanf, fscanf, gets, ...v.v là không an toàn bởi vì nó có thể gây tràn bộ nhớ đệm khi đọc dữ liệu nhập từ người dùng.

Bởi vì sao không an toàn? Giả sử bạn khai báo một biến chuỗi str chỉ lưu được 10 ký tự, trong khi đó người dùng nhập vào nhiều hơn 10 ký tự, ví dụ như 15 ký tự chẳng hạn, vấn đề tràn bộ nhớ đệm sẽ xảy ra, có thể trong lúc phát triển phần mềm bạn nhập vào 1 input hợp lệ nhưng đừng bao giờ tin tưởng vào người dùng, input của họ có thể là bất cứ thứ gì.

Nó có quan trọng hay không?

Không quan trọng, thậm chí còn gây phiền hà cho người lập trình (ví dụ như mình), bạn có thể chọn bỏ qua bằng cách thêm vào dòng mã nguồn ở trên cùng của chương trình,

#define _CRT_SECURE_NO_DEPRECATE

hoặc

#pragma warning(disable:4996)

Nhưng khi chọn bỏ qua, hãy đảm bảo rằng bạn đang biết rõ hoặc ước lượng tốt các giá trị input đọc vào trong chương trình của bạn là gì.

Nếu bạn không bỏ qua mà sử dụng các hàm scanf_s, fscanf_s, ... thay thế theo đề nghị của trình biên dịch Visual Studio thì bạn nên lưu ý một điều rằng các hàm scanf_s, fscanf_s, ... không phải là những hàm nằm trong định nghĩa chuẩn của C mà là các hàm riêng của Visual Studio, điều này có nghĩa là mã nguồn của bạn chỉ chạy được trên Microsoft Windows mà không chạy được trên Linux hoặc các trình biên dịch C/C++ khác.

đã bổ sung 5.3 năm trước bởi
Avatar: NOTHING NOTHING50
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)