19#ifndef HEDGEHOG_CX_DATA_RACE_TEST_H_
20#define HEDGEHOG_CX_DATA_RACE_TEST_H_
33template<tool::HedgehogDynamicGraphForStaticAnalysis GraphType>
34class DataRaceTest :
public hh_cx::AbstractTest<GraphType> {
37 constexpr DataRaceTest() : AbstractTest<GraphType>(
"DataRaceTest") {}
40 constexpr ~DataRaceTest()
override =
default;
44 constexpr void test(hh_cx::Graph<GraphType>
const *graph)
override {
45 auto ®isteredNodes = graph->registeredNodes();
47 for (
size_t senderId = 0; senderId < registeredNodes.size(); ++senderId) {
48 tool::TypesNodesMap map{};
49 auto senderNode = graph->node(senderId);
50 for (
size_t receiverId = 0; receiverId < graph->adjacentNodesTypes(senderNode).size(); ++receiverId) {
51 for (
auto &type : graph->adjacentNodesTypes(senderNode).at(receiverId)) {
52 map.insert(type, graph->node(receiverId));
55 for (
auto const &type : map.types()) {
56 if (map.nodes(type).size() > 1) {
57 bool isOutputSafe =
true;
58 for (
auto const &receiverNode : map.nodes(type)) {
60 graph->isROLinked(senderNode, receiverNode, type)
61 || graph->isConstLinked(senderNode, receiverNode, type)
65 if (this->errorMessage().empty()) { this->appendErrorMessage(
"Possible data races found:\n"); }
66 for (
auto &receiverNode : map.nodes(type)) {
67 this->appendErrorMessage(
"\t");
68 this->appendErrorMessage(senderNode->name());
69 this->appendErrorMessage(
" -> ");
70 this->appendErrorMessage(receiverNode->name());
71 this->appendErrorMessage(
" (");
72 this->appendErrorMessage(type);
73 this->appendErrorMessage(
")\n");
80 if (!this->errorMessage().empty()) {
81 this->graphValid(
false);