Anonymous | Login | 2024-04-25 19:22 CEST |
Main | My View | View Issues | Change Log | Wiki | Tavern | News |
Viewing Issue Simple Details [ Jump to Notes ] [ Wiki ] | [ View Advanced ] [ Issue History ] [ Print ] | ||||||||||||
ID | Category | Severity | Reproducibility | Date Submitted | Last Update | ||||||||
0011837 | [DCSS] Bug Report | minor | always | 2019-01-22 02:02 | 2019-01-24 00:32 | ||||||||
Reporter | Laret | View Status | public | ||||||||||
Assigned To | amalloy | ||||||||||||
Priority | normal | Resolution | done | ||||||||||
Status | resolved | Product Branch | 0.23 ancient branch | ||||||||||
Summary | 0011837: Elec weapons (at least the one I'm using) repeat target name | ||||||||||||
Description |
I'm wielding +6 short sword of the Other Side {elec, rPois Int+3 Dex+3} and when I hit mobs and the elec attack triggers, the mob name gets duped. For example: Lightning courses through the wormworm Lightning courses through the oozeooze Lightning courses through the howler monkeyhowler monkey |
||||||||||||
Additional Information | |||||||||||||
Tags | No tags attached. | ||||||||||||
Attached Files | |||||||||||||
|
Notes | |
(0032957) NormalPerson7 (reporter) 2019-01-22 08:19 edited on: 2019-01-22 08:24 |
I can't replicate this offline and I see no reason why this should be the case online either, looking at the code. Just to be clear, the electricity message is printed in attack.cc line 1524, and the code is: const char* punctuation = attack_strength_punctuation(special_damage); special_damage_message = ... ? ... : make_stringf("Lightning courses through %s%s", defender->name(DESC_THE).c_str(), punctuation); However, if you continue to see this, or anyone else can replicate this, please post it here. |
(0032961) Laret (reporter) 2019-01-22 22:20 |
Interesting, thanks. I haven't found another elec weapon yet, but it still happens after my save game got upgraded by today's trunk update, and it doesn't happen for a freezing weapon. |
(0032962) Laret (reporter) 2019-01-23 22:55 |
Started a new game and the same thing is happening with a +2 whip of electrocution. You whack the goblin! Lightning courses through the goblingoblin |
(0032963) Laret (reporter) 2019-01-23 22:56 |
(I can't imagine it matters, but this is on berotato. http://crawl.berotato.org:8080/#play-dcss-git [^] ) |
(0032964) Laret (reporter) 2019-01-23 23:15 |
I suspect I know what's going on here... Here's the code from 1519-1524 in attack.cc: const char *punctuation = attack_strength_punctuation(special_damage).c_str(); special_damage_message = defender->is_player() ? make_stringf("You are electrocuted%s", punctuation) : make_stringf("Lightning courses through %s%s", defender->name(DESC_THE).c_str(), punctuation); Note that punctuation is the result of calling c_str() on the TEMPORARY string returned by attack_strength_punctuation. If that string has been destroyed before make_string is being called, isn't it reasonable to assume that defender->name(DESC_THE) would be using the same stack block, and, if the short-string optimization is in effect, both c_str() calls might be returning the same address? If that's the case, the fix would be to save the punctuation string: string punctuation = attack_strength_punctuation(special_damage); special_damage_message = defender->is_player() ? make_stringf("You are electrocuted%s", punctuation) : make_stringf("Lightning courses through %s%s", defender->name(DESC_THE).c_str(), punctuation.c_str()); |
(0032965) Laret (reporter) 2019-01-23 23:19 |
That would explain why only lightning damage does this - all the other damage types have the attack_strength_punctuation(dmg).c_str() call in the make_string statement. |
(0032966) ebering (developer) 2019-01-24 00:15 |
amalloy agrees with your assessment; I'll note that this doesn't reproduce in clang, but is undefined behaviour. Your suggested change looks like the correct solution (modulo a missed .c_str() call). |
(0032967) amalloy (developer) 2019-01-24 00:17 |
Fixed in https://github.com/crawl/crawl/commit/16358f6e3a79. [^] |
(0032968) Laret (reporter) 2019-01-24 00:28 |
Thanks! (What missed .c_str() call? I put the call in the make_string) |
(0032969) ebering (developer) 2019-01-24 00:29 |
There are two make_stringf calls, you missed make_stringf("You are electrocuted%s", punctuation) |
(0032970) Laret (reporter) 2019-01-24 00:32 |
D'oh, you are absolutely correct. *blush* Thanks! |
Mantis 1.1.8[^] Copyright © 2000 - 2009 Mantis Group |