{
  "filename": "download.cpp",
  "rule": "- name: reply-has-deferred-deletion\n  where: \"download.cpp\"\n  ensure: >-\n    startDownload must connect the reply finished signal to deleteLater so completed replies are not retained indefinitely.",
  "corrected": "#include <QNetworkAccessManager>\n#include <QNetworkReply>\n#include <QNetworkRequest>\n#include <QObject>\n\nQNetworkReply* startDownload(QNetworkAccessManager* manager, const QUrl& url, QObject* owner) {\n    auto* reply = manager->get(QNetworkRequest(url));\n    QObject::connect(reply, &QNetworkReply::finished, reply, &QObject::deleteLater);\n    QObject::connect(owner, &QObject::destroyed, reply, [reply] { reply->abort(); });\n    return reply;\n}\n",
  "broken": "#include <QNetworkAccessManager>\n#include <QNetworkReply>\n#include <QNetworkRequest>\n#include <QObject>\n\nQNetworkReply* startDownload(QNetworkAccessManager* manager, const QUrl& url, QObject* owner) {\n    auto* reply = manager->get(QNetworkRequest(url));\n    QObject::connect(owner, &QObject::destroyed, reply, [reply] { reply->abort(); });\n    return reply;\n}\n",
  "regression": [
    "    QObject::connect(reply, &QNetworkReply::finished, reply, &QObject::deleteLater);\n",
    ""
  ],
  "test_scenarios": [
    [
      "Normal completion",
      "deleteLater scheduled"
    ],
    [
      "Owner destroyed during download",
      "Reply aborted"
    ],
    [
      "Network failure",
      "Completion still disposes reply"
    ],
    [
      "Consumer callback runs",
      "Reads data before scheduled deferred deletion"
    ]
  ],
  "test_source": null,
  "test_command": "ctest --test-dir build --output-on-failure"
}