C++ Warning: Warning C5045

Coconut** s = (Coconut**)malloc(5*sizeof(Coconut*));
for(size_t i = 0; I < 5; i++)
{
	s[i] = new Coconut();
}
s[0]->prev = nullptr;
		for (size_t i = 0; i < 5; i++)
		{
			s[i]->prev = s[i - 1];
			s[i]->next = s[i + 1];	//warning bị ngay đây	
		}
s[count - 1]->next = nullptr;

Cho mình hỏi tại sao đoạn code này bị warning như vầy? Nó chỉ bị warning trên cái project solution mà thầy mình đưa để làm bài tập. Mình thử tạo 1 project riêng để re-create cái warning nhưng không bị. Cả 2 project đều Enable All Warnings. Yêu cầu của bài là bên cạnh code đúng thì phải không warning nên không được tắt cái Enable All Warnings.

Nguyên văn Warning: C5045: Compiler will inser Spectre mitigation for memory load if/Qspectre switch specified.

Nếu vì do setting thì có cách nào sửa ngoại trừ cách đổi setting không?
PS: không được dùng array, vector, hay bất kì loại container nào của STL. Bài này ngoại lệ cho dùng malloc.

sao đi xài malloc với new tùm lum vậy :V

size_t i = 0; i < count - 1 i bắt đầu từ 0 sao truy cập s[i-1] được :V sao nó ko báo lỗi ở dòng này mà dòng dưới nhỉ? :V

count ở đâu ra vậy >_> ở trên 5 phần tử sao ở dưới ko phải là i < 5-1 mà lại là count-1 :V :V

3 Likes

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/c5045

4 Likes

sửa xong chưa, sửa rồi hỏi tiếp tại sao linked list lại được lưu trong mảng? Vậy cần linked list làm gì nữa :V :V

tại sao lại cần **s ở đây??

nếu như theo thớt bên kia thì medusa có Snake* head, thì thêm 1 đầu rắn vào sau cùng của linked list thì gọi hàm tương ứng ví dụ insert_last(Snake*&) 5 lần, chứ làm gì tạo cái mảng 5 phần tử rồi khổ sở đi nối lại với nhau vậy???

4 Likes

count là mình dùng trong code của mình. Cái này là ví dụ nên mình hardcode cho dễ hiểu để khỏi phải copy cả cái project. Mình đã sửa lại.

Mình cũng đã sửa lại chỗ bạn nói. Không để ý nhưng cũng khôn biết tại sao nó không crash @@.

Cái này nằm trong cái bài này: Dữ liệu tồn tại sau khi gọi delete

Tại sao mình dùng malloc thì để cho dễ nối Coconut lại với nhau theo dạng linked list. Dùng mấy biến temp để nối rối quá nên mình làm vậy, cứ quăng hết vô cái array của malloc rồi nối lại theo index. Có hơi ăn gian chút nhưng vì cho nên mình vận làm. Dãy truyền vô như thế nào thì sau khi gửi nó qua máy khác mình cũng phải nối nó lại y như cũ.

Tại sao gọi new thì sau khi nhận được dữ liệu từ máy kia, mình sẽ re-construct lại các object bằng các dữ liệu đó. Gọi new để tạo object, rồi gọi deserialize để set giá trị cho object. Bạn có thể xem cái link tới bài trên để tham khảo cái UML

dùng 1 vòng for vừa tạo vừa thêm vào khó lắm sao mà đi tạo cái mảng tạm thế là sao?? Nó báo lỗi trong cái for kì cục đó thì bỏ cái vụ mảng tạm đi.

4 Likes

Để mình sửa lại nhưng mà cho mình hỏi nó có liên quan gì tới cái warning không?

chắc có, trong cái link MS docs kia có nói là Spectre mitigation gì đó mà :V

image

cũng con trỏ 2 cấp, gán = p[i] thì nó la làng :V

4 Likes

Từ Microsoft doc mà @rogp10 đã đưa ra ở đây:

This warning is purely informational: the mitigation is not inserted until you recompile using the /Qspectre switch

Nó chỉ là thông báo thôi, cậu có thể bỏ qua.
Còn liên quan tới lý do của warning đó, về cơ bản, đoạn code của cậu có khả năng bị Spectre security attack, nên compiler thông báo nó sẽ chèn thêm 1 đoạn code để chống Spectre attack.
Cậu có thể đọc doc mà tớ đề cập ở trên đây để hiểu thêm về Spectre attack. Tuy nhiên, tớ nghĩ nó sẽ hơi khó hiểu đối với cậu đấy.

EDIT: Cậu có thể tham khảo Developer guildance for speculative execution, để hiểu rõ hơn về nguyên nhân, cũng như cách tránh, hay thậm chí cả code mà compiler sẽ thêm vào để chống spectre.


Tớ tò mò, biến ‘I’ là biến ‘I’ hay biến ‘l’ thế? :rofl:

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?