Fix undefined behavior in dependency graph tagging
The tagging code was iterating over bits set in the ID_RECALC_ALL and was casting the flag to IDRecalcFlag. This was triggering an undefined behavior warning in Clang since the bit might not have a corresponding value in the enumerator. The solution is to pre-define all reacalc flags for all bits. While this seems a bit annoying this seems to be the least fragile solution from all suggested ones. Differential Revision: https://developer.blender.org/D15602
This commit is contained in:
parent
1c90ab7bf2
commit
bb7747e7ca
|
@ -220,6 +220,15 @@ void depsgraph_tag_to_component_opcode(const ID *id,
|
|||
*component_type = NodeType::NTREE_OUTPUT;
|
||||
*operation_code = OperationCode::NTREE_OUTPUT;
|
||||
break;
|
||||
|
||||
case ID_RECALC_PROVISION_26:
|
||||
case ID_RECALC_PROVISION_27:
|
||||
case ID_RECALC_PROVISION_28:
|
||||
case ID_RECALC_PROVISION_29:
|
||||
case ID_RECALC_PROVISION_30:
|
||||
case ID_RECALC_PROVISION_31:
|
||||
BLI_assert_msg(0, "Should not happen");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -741,6 +750,15 @@ const char *DEG_update_tag_as_string(IDRecalcFlag flag)
|
|||
return "TAG_FOR_UNDO";
|
||||
case ID_RECALC_NTREE_OUTPUT:
|
||||
return "ID_RECALC_NTREE_OUTPUT";
|
||||
|
||||
case ID_RECALC_PROVISION_26:
|
||||
case ID_RECALC_PROVISION_27:
|
||||
case ID_RECALC_PROVISION_28:
|
||||
case ID_RECALC_PROVISION_29:
|
||||
case ID_RECALC_PROVISION_30:
|
||||
case ID_RECALC_PROVISION_31:
|
||||
BLI_assert_msg(0, "Should not happen");
|
||||
return nullptr;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -870,6 +870,17 @@ typedef enum IDRecalcFlag : unsigned int {
|
|||
/* The node tree has changed in a way that affects its output nodes. */
|
||||
ID_RECALC_NTREE_OUTPUT = (1 << 25),
|
||||
|
||||
/* Provisioned flags.
|
||||
*
|
||||
* Not for actual use. The idea of them is to have all bits of the `IDRecalcFlag` defined to a
|
||||
* known value, silencing sanitizer warnings when checkign bits of the ID_RECALC_ALL. */
|
||||
ID_RECALC_PROVISION_26 = (1 << 26),
|
||||
ID_RECALC_PROVISION_27 = (1 << 27),
|
||||
ID_RECALC_PROVISION_28 = (1 << 28),
|
||||
ID_RECALC_PROVISION_29 = (1 << 29),
|
||||
ID_RECALC_PROVISION_30 = (1 << 30),
|
||||
ID_RECALC_PROVISION_31 = (1u << 31),
|
||||
|
||||
/***************************************************************************
|
||||
* Pseudonyms, to have more semantic meaning in the actual code without
|
||||
* using too much low-level and implementation specific tags. */
|
||||
|
|
Loading…
Reference in New Issue