boostorg / boostorg/parser

Sequence parser overwrites std::u32string

Offen
#327 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
C++
Sterne
182
Forks
28
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Consider the following example.
```cpp
#include
#include

#include

namespace bp = boost::parser;

int main(int argc, char *argv[]) {
auto input = std::string{"ab"};
auto res = std::string();
const auto result = bp::parse(
input
, (bp::char_ >> bp::char_)
, res
);
if (result) {
std::print("Parse successful\n");
std::print("{}\n", res);
} else {
std::print("Parse failed\n");
}
}
```
It outputs
```
Parse successful
ab
```
Now consider this change
```cpp
#include
#include
#include

#include
#include

namespace bp = boost::parser;
namespace rs = std::ranges;

int main(int argc, char *argv[]) {
auto input = std::u32string{U"ab"};
auto res = std::u32string();
const auto result = bp::parse(
input
, (bp::char_ >> bp::char_)
, res
);
if (result) {
std::print("Parse successful\n");
std::print("{}\n", res | bp::as_utf8 | rs::to());
} else {
std::print("Parse failed\n");
}
}
```
It outputs
```
Parse successful
b
```
The issue is here:
```cpp
if constexpr (detail::is_nope_v) {
// nothing to do
} if constexpr (
(!out_container ||
!std::is_same_v) &&
std::is_assignable_v &&
(!std::is_same_v ||
!std::is_integral_v)) {
detail::assign(out, std::move(x));
} else {
detail::move_back(
out, std::move(x), detail::gen_attrs(flags));
}
```
This code adds to a string only if it is an `std::string`. Otherwise, it assigns every character to the same string.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Reproduziere das Beispiel mit std::u32string und boost/parser/parser.hpp und untersuche den gezeigten Block zur Attributzuweisung in der Parser-Implementierung. Überprüfe, dass der Sequenzparser beide Zeichen in der Ausgabe beibehält, anstatt das erste zu überschreiben, und füge einen Regressionstest hinzu oder führe ihn aus, falls das Repository einen geeigneten Ort für Parser-Tests bereitstellt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
cpp
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
55/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.