Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

XMLNode::InsertAfterChild dereferences NULL when addThis is already afterThis's next sibling

オープン 初心者向け
#1,101 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

@zhouyunding がすでに取り組んでいます。

2026年10月20日 から。

  • #1103 @zhouyunding による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
88/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
cpp
領域
backend

調査の方向性

tinyxml2.cpp の 1014~1021 行付近にある XMLNode::InsertAfterChild から始めます。issue では、兄弟ノードへのポインターを更新する前に addThis のリンクを解除することがクラッシュの原因とされています。子ノード挿入に関する既存のテストを確認し、提示された 2 つの子ノードの例に対応する回帰テストを追加します。すでに afterThis の直後にあるノードを挿入しても安全に戻り、回帰テストが成功すれば完了です。

索引モデルが issue の本文から書いたものです。

説明

InsertAfterChild(afterThis, addThis) crashes when addThis is already
immediately after afterThis and is the last child. master @ 8224e42.

#include "tinyxml2/tinyxml2.h"
using namespace tinyxml2;

int main() {
    XMLDocument doc;
    doc.Parse("<r><a/><b/></r>");
    XMLElement* r = doc.RootElement();
    XMLNode* a = r->FirstChildElement("a");
    XMLNode* b = r->FirstChildElement("b");
    r->InsertAfterChild(a, b);   // SEGV
}
AddressSanitizer: SEGV on unknown address 0x000000000048
  #0 tinyxml2::XMLNode::InsertAfterChild(...) tinyxml2.cpp:1021

0x48 is the offset of _prev.

Root cause. The guard at 1014 is evaluated before InsertChildPreamble
unlinks addThis, and that unlink invalidates it:

if ( afterThis->_next == 0 )       // 1014: a->_next is b, not NULL -- does not fire
    return InsertEndChild( addThis );
InsertChildPreamble( addThis );    // 1018: Unlink(b) -> a->_next becomes NULL
addThis->_next = afterThis->_next; // 1020: NULL
afterThis->_next->_prev = addThis; // 1021: dereferences NULL

Fix. Early return when the node is already in place:

if ( afterThis->_next == addThis )
    return addThis;
主要言語
C++
スター
5.8k
フォーク
2k
PR マージ指標
30日以内にマージされた PR はありません

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

leethomason/tinyxml2 のほかの issue

leethomason/tinyxml2 の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。