Tiếp cấp độ lỗi này.
Cấp độ 3:
API chạy cho ra kết quả đúng, nhưng có những hệ quả không lường (unexpected side effects).
Code kiểu này rất nguy hiểm vì API là hợp đồng duy nhất có giá trị bền vững đối với các bên gọi API. Phần implementation của API có thể thay đổi bất cứ lúc nào.
Một trong những bug nổi tiếng nhất về cái này là bug memory của Microsoft.
Đại khái Windows có một hàm là hàm trả lại bộ nhớ (free memory). Trước windows XP thì hàm này khi bạn gọi ko làm gì về phần bộ nhớ đã có, nên phần gọi API vẫn có thể dùng bộ nhớ đã xoá.
Đến khi windows cập nhật lên bản XP, họ đổi implementation của hàm này khiến cho bộ nhớ đã bị xoá ko còn sử dụng lại được gây ra lỗi trên game Sim City. Kết quả là đội windows phải viết lại hàm free bộ nhớ của họ kiểu như sau:
If play_sim_city():
use old memory deallocator
else:
use newmemory deallocator
Vậy lỗi ở đây là gì?
1) Các nhà sản xuất game sim City phá vỡ contract của memory deallocator, vẫn sử dụng memory sau khi xoá
2) Các lập trình viên microsoft chủ quan trong chuyện defend API của họ. Ko xoá đi phần bộ nhớ cũ trong implementation đầu tiên.
Một điểm quan trọng cần chú ý là nếu bạn là platform hoặc library developer, bạn ko thể trách customer bạn ngu được. "What can go wrong will go wrong" --> thế nên nhiệm vụ của bạn là phải foolproof cả API và implementation của bạn để tránh người dùng sử dụng sai.
Đọc thêm bài viết tiếng Anh sau của Joel Software:
https://www.joelonsoftware.com/2004/06/13/how-microsoft-lost-the-api-war/