Skip to content

Commit 6974c88

Browse files
committed
Avoid dangerous Element->getModel()->isConnector()
- Fix missing checks for if an elements model exists before trying to use it by adding `Element::isConnector` and using that instead of `Element->getModel()->isConnector()`.
1 parent e7bef41 commit 6974c88

File tree

7 files changed

+43
-21
lines changed

7 files changed

+43
-21
lines changed

OMEdit/OMEditLIB/Annotations/LineAnnotation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,7 @@ void LineAnnotation::handleCollidingConnections()
14111411
QList<QGraphicsItem*> items = collidingItems(Qt::IntersectsItemShape);
14121412
for (int i = 0; i < items.size(); ++i) {
14131413
if (Element *pElement = dynamic_cast<Element*>(items.at(i))) {
1414-
if ((pElement->getModel() && pElement->getModel()->isConnector())
1414+
if (pElement->isConnector()
14151415
|| (pElement->getLibraryTreeItem() && (pElement->getLibraryTreeItem()->getOMSConnector() || pElement->getLibraryTreeItem()->getOMSBusConnector()
14161416
|| pElement->getLibraryTreeItem()->getOMSTLMBusConnector()))) {
14171417
mCollidingConnectorElements.append(pElement);

OMEdit/OMEditLIB/Element/Element.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ QRectF Element::boundingRect() const
401401
} else if (isPort()) {
402402
ExtentAnnotation extent;
403403
if (mpModelComponent) {
404-
if (mpModelComponent->getModel()->isConnector() && (mpGraphicsView->isDiagramView()) && canUseDiagramAnnotation()) {
404+
if (mpModelComponent->isConnector() && (mpGraphicsView->isDiagramView()) && canUseDiagramAnnotation()) {
405405
mpModelComponent->getAnnotation()->getPlacementAnnotation().getTransformation().getExtent();
406406
} else {
407407
mpModelComponent->getAnnotation()->getPlacementAnnotation().getIconTransformation().getExtent();
@@ -557,7 +557,7 @@ ModelInstance::CoordinateSystem Element::getCoordinateSystem() const
557557
{
558558
ModelInstance::CoordinateSystem coordinateSystem;
559559
if (mpModelComponent && mpModel) {
560-
if (mpModelComponent->getModel()->isConnector() && (mpGraphicsView->isDiagramView()) && canUseDiagramAnnotation()) {
560+
if (mpModelComponent->isConnector() && (mpGraphicsView->isDiagramView()) && canUseDiagramAnnotation()) {
561561
coordinateSystem = mpModel->getAnnotation()->getDiagramAnnotation()->mMergedCoordinateSystem;
562562
} else {
563563
coordinateSystem = mpModel->getAnnotation()->getIconAnnotation()->mMergedCoordinateSystem;
@@ -626,7 +626,7 @@ QString Element::getPlacementAnnotation(bool ModelicaSyntax)
626626
placementAnnotationString.append(QString("visible=%1,").arg(mTransformation.getVisible().toQString()));
627627
}
628628
}
629-
if ((mpLibraryTreeItem && mpLibraryTreeItem->isConnector()) || (mpModelComponent && mpModelComponent->getModel()->isConnector())) {
629+
if ((mpLibraryTreeItem && mpLibraryTreeItem->isConnector()) || (mpModelComponent && mpModelComponent->isConnector())) {
630630
if (mpGraphicsView->isIconView()) {
631631
// first get the component from diagram view and get the transformations
632632
Element *pElement = mpGraphicsView->getModelWidget()->getDiagramGraphicsView()->getElementObject(getName());
@@ -692,7 +692,7 @@ QString Element::getOMCPlacementAnnotation(QPointF position)
692692
if (mTransformation.isValid()) {
693693
placementAnnotationString.append(mTransformation.getVisible() ? "true" : "false");
694694
}
695-
if ((mpLibraryTreeItem && mpLibraryTreeItem->isConnector()) || (mpModelComponent && mpModelComponent->getModel()->isConnector())) {
695+
if ((mpLibraryTreeItem && mpLibraryTreeItem->isConnector()) || (mpModelComponent && mpModelComponent->isConnector())) {
696696
if (mpGraphicsView->isIconView()) {
697697
// first get the component from diagram view and get the transformations
698698
Element *pElement;
@@ -746,6 +746,16 @@ QString Element::getTransformationExtent()
746746
return transformationExtent;
747747
}
748748

749+
/*!
750+
* \brief Element::isConnector
751+
* Returns true if the Element class is connector.
752+
* \return
753+
*/
754+
bool Element::isConnector() const
755+
{
756+
return mpModel && mpModel->isConnector();
757+
}
758+
749759
/*!
750760
* \brief Element::isExpandableConnector
751761
* Returns true if the Element class is expandable connector.
@@ -891,7 +901,7 @@ void Element::createClassElements()
891901
foreach (auto pElement, elements) {
892902
if (pElement->isComponent()) {
893903
auto pComponent = dynamic_cast<ModelInstance::Component*>(pElement);
894-
if (pComponent->isPublic() && pComponent->getModel() && pComponent->getModel()->isConnector()) {
904+
if (pComponent->isPublic() && pComponent->isConnector()) {
895905
mElementsList.append(new Element(pComponent, this, getRootParentElement()));
896906
}
897907
}
@@ -1530,11 +1540,11 @@ void Element::createClassShapes()
15301540
// Always use the IconMap here. Only IconMap makes sense for drawing icons of Element.
15311541
if (!(pExtendModel && !pExtendModel->getIconDiagramMapPrimitivesVisible(true))) {
15321542
/* issue #12074
1533-
* Use mpModelComponent->getModel()->isConnector() here instead of mpModel->isConnector()
1543+
* Use mpModelComponent->isConnector() here instead of mpModel->isConnector()
15341544
* So when called for extends we use the top level element restriction.
15351545
* We use the same mpModelComponent for top level and extends elements. See Element constructor above for extends element type.
15361546
*/
1537-
if (mpModelComponent && mpModelComponent->getModel()->isConnector() && mpGraphicsView->isDiagramView() && canUseDiagramAnnotation()) {
1547+
if (mpModelComponent && mpModelComponent->isConnector() && mpGraphicsView->isDiagramView() && canUseDiagramAnnotation()) {
15381548
shapes = mpModel->getAnnotation()->getDiagramAnnotation()->getGraphics();
15391549
} else {
15401550
shapes = mpModel->getAnnotation()->getIconAnnotation()->getGraphics();

OMEdit/OMEditLIB/Element/Element.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ class Element : public QObject, public QGraphicsItem
159159
QString getOMCPlacementAnnotation(QPointF position);
160160
QString getTransformationOrigin();
161161
QString getTransformationExtent();
162+
bool isConnector() const;
162163
bool isExpandableConnector() const;
163164
bool isArray() const;
164165
QStringList getAbsynArrayIndexes() const;

OMEdit/OMEditLIB/Modeling/Commands.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ void UpdateComponentTransformationsCommand::redoInternal()
234234
{
235235
ModelWidget *pModelWidget = mpComponent->getGraphicsView()->getModelWidget();
236236
if (mMoveConnectorsTogether && pModelWidget->getLibraryTreeItem()->isModelica()
237-
&& (mpComponent->getModel() && mpComponent->getModel()->isConnector())) {
237+
&& mpComponent->isConnector()) {
238238
GraphicsView *pGraphicsView;
239239
if (mpComponent->getGraphicsView()->isIconView()) {
240240
pGraphicsView = pModelWidget->getDiagramGraphicsView();
@@ -274,8 +274,7 @@ void UpdateComponentTransformationsCommand::redoInternal()
274274
void UpdateComponentTransformationsCommand::undo()
275275
{
276276
ModelWidget *pModelWidget = mpComponent->getGraphicsView()->getModelWidget();
277-
if (mMoveConnectorsTogether && pModelWidget->getLibraryTreeItem()->isModelica()
278-
&& (mpComponent->getModel() && mpComponent->getModel()->isConnector())) {
277+
if (mMoveConnectorsTogether && pModelWidget->getLibraryTreeItem()->isModelica() && mpComponent->isConnector()) {
279278
GraphicsView *pGraphicsView;
280279
if (mpComponent->getGraphicsView()->isIconView()) {
281280
pGraphicsView = pModelWidget->getDiagramGraphicsView();

OMEdit/OMEditLIB/Modeling/Model.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1514,7 +1514,7 @@ namespace ModelInstance
15141514
if (connector.size() == 1) return true;
15151515

15161516
auto elem = model.lookupElement(connector.first().getName(false));
1517-
return elem && elem->getModel() && elem->getModel()->isConnector();
1517+
return elem && elem->isConnector();
15181518
}
15191519

15201520
bool isCompatibleConnectorDirection(const Element &lhs, bool lhsOutside, const Element &rhs, bool rhsOutside)
@@ -2093,6 +2093,16 @@ namespace ModelInstance
20932093
return mpPrefixes ? mpPrefixes.get()->isRedeclare() : false;
20942094
}
20952095

2096+
bool Element::isConnector() const
2097+
{
2098+
return mpModel && mpModel->isConnector();
2099+
}
2100+
2101+
bool Element::isExpandableConnector() const
2102+
{
2103+
return mpModel && mpModel->isExpandableConnector();
2104+
}
2105+
20962106
QString Element::getConnector() const
20972107
{
20982108
return mpPrefixes ? mpPrefixes.get()->getConnector() : "";

OMEdit/OMEditLIB/Modeling/Model.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,8 @@ namespace ModelInstance
699699
bool isInput() const;
700700
Replaceable *getReplaceable() const;
701701
bool isRedeclare() const;
702+
bool isConnector() const;
703+
bool isExpandableConnector() const;
702704
QString getConnector() const;
703705
QString getVariability() const;
704706
QString getDirectionPrefix() const;

OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ void GraphicsView::drawElements(ModelInstance::Model *pModelInstance, bool inher
370370
if (pModelInstanceElement->isComponent() && pModelInstanceElement->getModel()) {
371371
auto pModelInstanceComponent = dynamic_cast<ModelInstance::Component*>(pModelInstanceElement);
372372
elementIndex++;
373-
if (pModelInstanceComponent->getModel()->isConnector()) {
373+
if (pModelInstanceComponent->isConnector()) {
374374
connectorIndex++;
375375
}
376376
if (modelInfo.mDiagramElementsList.isEmpty() || inherited) {
@@ -386,7 +386,7 @@ void GraphicsView::drawElements(ModelInstance::Model *pModelInstance, bool inher
386386
pDiagramGraphicsView->addElementItem(pDiagramElement);
387387
pDiagramGraphicsView->addElementToList(pDiagramElement);
388388
pDiagramGraphicsView->deleteElementFromOutOfSceneList(pDiagramElement);
389-
if (pModelInstanceComponent->getModel()->isConnector() && connectorIndex < modelInfo.mIconElementsList.size()) {
389+
if (pModelInstanceComponent->isConnector() && connectorIndex < modelInfo.mIconElementsList.size()) {
390390
Element *pIconElement = modelInfo.mIconElementsList.at(connectorIndex);
391391
if (pIconElement) {
392392
pIconElement->setModelComponent(pModelInstanceComponent);
@@ -938,14 +938,14 @@ void GraphicsView::addElementToView(ModelInstance::Component *pComponent, bool i
938938
GraphicsView *pDiagramGraphicsView = mpModelWidget->getDiagramGraphicsView();
939939

940940
// if element is of connector type.
941-
if (pComponent && pComponent->getModel()->isConnector()) {
941+
if (pComponent && pComponent->isConnector()) {
942942
// Connector type elements exists on icon view as well
943943
pIconElement = new Element(pComponent, inherited, pIconGraphicsView, createTransformation, position, placementAnnotation);
944944
}
945945
pDiagramElement = new Element(pComponent, inherited, pDiagramGraphicsView, createTransformation, position, placementAnnotation);
946946

947947
// if element is of connector type && containing class is Modelica type.
948-
if (pIconElement && pComponent->getModel()->isConnector()) {
948+
if (pIconElement && pComponent->isConnector()) {
949949
// Connector type elements exists on icon view as well
950950
if (pIconElement->mTransformation.isValid() && pIconElement->mTransformation.getVisible()) {
951951
pIconGraphicsView->addElementItem(pIconElement);
@@ -1120,7 +1120,7 @@ void GraphicsView::deleteElement(Element *pElement)
11201120
if (mpModelWidget->getLibraryTreeItem()->isSSP()) {
11211121
OMSProxy::instance()->omsDelete(pElement->getLibraryTreeItem()->getNameStructure());
11221122
} else {
1123-
if (pElement->getModel() && pElement->getModel()->isConnector()) {
1123+
if (pElement->isConnector()) {
11241124
GraphicsView *pGraphicsView;
11251125
if (isIconView()) {
11261126
pGraphicsView = mpModelWidget->getDiagramGraphicsView();
@@ -3113,12 +3113,12 @@ Element* GraphicsView::connectorElementAtPosition(QPoint position)
31133113
return 0;
31143114
} else if (pRootElement && !pRootElement->isSelected()) {
31153115
// Issue #11310. If both root and element are connectors then use the root.
3116-
if (pRootElement->getModel() && pRootElement->getModel()->isConnector() && pElement && pElement->getModel() && pElement->getModel()->isConnector()) {
3116+
if (pRootElement->isConnector() && pElement && pElement->isConnector()) {
31173117
pElement = pRootElement;
31183118
}
31193119
if (MainWindow::instance()->getConnectModeAction()->isChecked() && isDiagramView() &&
31203120
!(mpModelWidget->getLibraryTreeItem()->isSystemLibrary() || mpModelWidget->isElementMode() || isVisualizationView()) &&
3121-
((pElement->getModel() && pElement->getModel()->isConnector()) ||
3121+
(pElement->isConnector() ||
31223122
(mpModelWidget->getLibraryTreeItem()->isSSP() &&
31233123
(pElement->getLibraryTreeItem()->getOMSConnector() || pElement->getLibraryTreeItem()->getOMSBusConnector()
31243124
|| pElement->getLibraryTreeItem()->getOMSTLMBusConnector() || pElement->isPort())))) {
@@ -3640,7 +3640,7 @@ void GraphicsView::copyItems(bool cut)
36403640
QJsonObject componentJsonObject;
36413641
componentJsonObject.insert(QLatin1String("classname"), pElement->getClassName());
36423642
componentJsonObject.insert(QLatin1String("name"), pElement->getName());
3643-
componentJsonObject.insert(QLatin1String("connector"), pElement->getModel() ? pElement->getModel()->isConnector() : false);
3643+
componentJsonObject.insert(QLatin1String("connector"), pElement->isConnector());
36443644
componentJsonObject.insert(QLatin1String("placement"), pElement->getOMCPlacementAnnotation(QPointF(0, 0)));
36453645
componentsJsonArray.append(componentJsonObject);
36463646
} else if (ShapeAnnotation *pShapeAnnotation = dynamic_cast<ShapeAnnotation*>(itemsList.at(i))) {
@@ -7018,7 +7018,7 @@ void ModelWidget::selectDeselectElement(const QString &name, bool selected)
70187018
pDiagramElement->setIgnoreSelection(true);
70197019
pDiagramElement->setSelected(selected);
70207020
pDiagramElement->setIgnoreSelection(false);
7021-
if (mpIconGraphicsView && pDiagramElement->getModel() && pDiagramElement->getModel()->isConnector()) {
7021+
if (mpIconGraphicsView && pDiagramElement->isConnector()) {
70227022
Element *pIconElement = mpIconGraphicsView->getElementObjectFromQualifiedName(name);
70237023
pIconElement->setIgnoreSelection(true);
70247024
pIconElement->setSelected(selected);

0 commit comments

Comments
 (0)