Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crank up static analysis audit #2607

Merged
merged 56 commits into from
Sep 10, 2019
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
1989eb9
Make warnings errors for static analysis.
miniksa Aug 29, 2019
65dec36
C26446, Use .at instead of array indices
miniksa Aug 29, 2019
23897b1
[Complex] C26446, Use .at instead of array indices - Reword UTF8OutPi…
miniksa Aug 29, 2019
bd2d5dd
C26477, don't use 0 or NULL, use nullptr.
miniksa Aug 29, 2019
b33a598
C26496, mark const if it's never written after creation
miniksa Aug 29, 2019
c63289b
C26493, no C-style casts.
miniksa Aug 29, 2019
a381f6a
C26435, choose one of `virtual`, `override`, or `final`
miniksa Aug 29, 2019
8ea7401
C26472, no static_cast for arithmetic conversions. narrow or narrow_cast
miniksa Aug 29, 2019
50e2d0c
C26433, overrides should be explicit.
miniksa Aug 29, 2019
8579d89
C26451, promote before arithmetic if storing in larger result size (o…
miniksa Aug 29, 2019
8c3a629
C26481, don't use pointer arithemetic. use span.
miniksa Aug 29, 2019
4f1157c
C26447,C26440 - is noexcept but can throw or doesn't throw but not no…
miniksa Aug 29, 2019
30e8e7f
C26429, symbols not tested for nullness.
miniksa Sep 3, 2019
cdfbf8f
C26474, don't use static_cast when an implicit cast is acceptable.
miniksa Sep 3, 2019
230e7f4
C26466, disable dynamic_cast rule because we're not RTTI due to OS po…
miniksa Sep 3, 2019
7d4096b
C26485, refactor to avoid array-to-pointer decay.
miniksa Sep 3, 2019
81ab580
C26473, do not cast pointer back to the same type.
miniksa Sep 3, 2019
d5d7cf4
C26494, uninitalized local variables
miniksa Sep 3, 2019
bbdfdf9
C26462, const local variables that are unchanged.
miniksa Sep 3, 2019
b180406
C26445, wstring_view byref may indicate a lifetime issue
miniksa Sep 3, 2019
c956913
C26497, use constexpr for functions that could be evaluated at compil…
miniksa Sep 3, 2019
594dca9
C26429, mark gsl::not_null on places where we don't test for null (sh…
miniksa Sep 3, 2019
45e5993
C26430, not tested for nullness on all paths. I will just always chec…
miniksa Sep 3, 2019
9678dd8
C26414, don't use smart pointers for locals
miniksa Sep 3, 2019
dd49c3e
C26460, use const on params that are unchanged (and remove some unnec…
miniksa Sep 3, 2019
d8bc94f
forgot all return paths to _FillRectangle.
miniksa Sep 3, 2019
2d3f285
C26432, rule-of-five (if you define one of destruct/copy/move, then d…
miniksa Sep 3, 2019
3bbd8f4
C26443, overriding destructors shouldn't declare virtual nor override.
miniksa Sep 3, 2019
b78d917
C26434, do not hide base class methods. Overriding this one because i…
miniksa Sep 3, 2019
b87f8f9
C26426, global initializers calling non-constexpr. Suppress for defau…
miniksa Sep 3, 2019
072bbfd
C26426, global initializer calls non-constexpr. This needs further co…
miniksa Sep 3, 2019
5d60d69
C26426, global initializer calls non-constexpr. This is an easy move …
miniksa Sep 3, 2019
c7f0a34
C26490, don't reinterpret_cast. It looks like the buffer can easily b…
miniksa Sep 3, 2019
cd144e9
C26436, destructor definition required for class with virtual methods.
miniksa Sep 3, 2019
e14a59a
C26455, default constructor may not throw. Mark `noexcept`. (Trivial …
miniksa Sep 3, 2019
87f5852
Define actual constructor for CodepointWidthDetector as default isn't…
miniksa Sep 3, 2019
b2c093f
C26455, default constructor may not throw, mark as nothrow (another t…
miniksa Sep 3, 2019
3a0da64
C26490, no reinterpret_cast. Suppress on OutputCellIterator because f…
miniksa Sep 3, 2019
244fb72
C26490, no reinterpret_cast. Just use the actual struct and copy inst…
miniksa Sep 3, 2019
41f209f
C26440, default constructors should be noexcept.
miniksa Sep 3, 2019
93aa945
C26429, test for nullness or mark as not_null (and a few cascading wa…
miniksa Sep 3, 2019
ae25a32
C26497, you can mark this thing as constexpr.
miniksa Sep 3, 2019
01bd770
C26429, mark as not_null if not testing for nullness.
miniksa Sep 3, 2019
23b4a46
C26429, C26481, don't use pointer arithmetic, test for nullness. Also…
miniksa Sep 3, 2019
4204733
C26481, don't use pointer arithmetic. Convert to measuring string wit…
miniksa Sep 3, 2019
6735311
Suppress last two errors (C26455 default constructor throw in DxEngin…
miniksa Sep 3, 2019
7d9534b
constexprs have to go into the headers or other usages can't find the…
miniksa Sep 4, 2019
7c66e66
Fix redefinition of class name for constexpr method I moved from CPP …
miniksa Sep 4, 2019
3bff2a3
fix merge conflict with master
miniksa Sep 4, 2019
b7c1e05
code formatter, you're killing me.
miniksa Sep 4, 2019
d0c207b
fix remaining issues that appeared on merge.
miniksa Sep 4, 2019
96cc772
Add GH issue IDs to all the suppress/disables that I left behind as t…
miniksa Sep 5, 2019
689c21e
PR feedback.
miniksa Sep 5, 2019
fc81adf
use the array size for the read bounds. using extent on the newly-con…
miniksa Sep 5, 2019
d8ff47a
Some of the PR feedback.
miniksa Sep 6, 2019
18bacfe
A few PR comments. A constexpr here, a misleading comment there, and …
miniksa Sep 9, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions src/StaticAnalysis.ruleset
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Console Rules" Description="These rules enforce static analysis on console code." ToolsVersion="15.0">

<Include Path="cppcorecheckrules.ruleset" Action="Default" />

<Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
<Rule Id="C6001" Action="Error" />
<Rule Id="C6011" Action="Error" />
</Rules>
<Include Path="cppcorecheckrules.ruleset" Action="Error" />

</RuleSet>
10 changes: 5 additions & 5 deletions src/buffer/out/AttrRow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void ATTR_ROW::Resize(const size_t newWidth)
{
// Get the attribute that covers the final column of old width.
const auto runPos = FindAttrIndex(_cchRowWidth - 1, nullptr);
auto& run = _list[runPos];
auto& run = _list.at(runPos);

// Extend its length by the additional columns we're adding.
run.SetLength(run.GetLength() + newWidth - _cchRowWidth);
Expand All @@ -60,7 +60,7 @@ void ATTR_ROW::Resize(const size_t newWidth)
// Get the attribute that covers the final column of the new width
size_t CountOfAttr = 0;
const auto runPos = FindAttrIndex(newWidth - 1, &CountOfAttr);
auto& run = _list[runPos];
auto& run = _list.at(runPos);

// CountOfAttr was given to us as "how many columns left from this point forward are covered by the returned run"
// So if the original run was B5 covering a 5 size OldWidth and we have a NewWidth of 3
Expand Down Expand Up @@ -108,7 +108,7 @@ TextAttribute ATTR_ROW::GetAttrByColumn(const size_t column,
{
THROW_HR_IF(E_INVALIDARG, column >= _cchRowWidth);
const auto runPos = FindAttrIndex(column, pApplies);
return _list[runPos].GetAttributes();
return _list.at(runPos).GetAttributes();
}

// Routine Description:
Expand Down Expand Up @@ -290,10 +290,10 @@ void ATTR_ROW::ReplaceAttrs(const TextAttribute& toBeReplacedAttr, const TextAtt
// two elements in our internal list.
else if (_list.size() == 2 && newAttrs.at(0).GetLength() == 1)
{
auto left = _list.begin();
const auto left = _list.begin();
if (iStart == left->GetLength() && NewAttr == left->GetAttributes())
{
auto right = left + 1;
const auto right = left + 1;
left->IncrementLength();
right->DecrementLength();

Expand Down
8 changes: 4 additions & 4 deletions src/buffer/out/AttrRowIterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,21 @@
#include "AttrRowIterator.hpp"
#include "AttrRow.hpp"

AttrRowIterator AttrRowIterator::CreateEndIterator(const ATTR_ROW* const attrRow)
AttrRowIterator AttrRowIterator::CreateEndIterator(const ATTR_ROW* const attrRow) noexcept
{
AttrRowIterator it{ attrRow };
it._setToEnd();
return it;
}

AttrRowIterator::AttrRowIterator(const ATTR_ROW* const attrRow) :
AttrRowIterator::AttrRowIterator(const ATTR_ROW* const attrRow) noexcept :
_pAttrRow{ attrRow },
_run{ attrRow->_list.cbegin() },
_currentAttributeIndex{ 0 }
{
}

AttrRowIterator::operator bool() const noexcept
AttrRowIterator::operator bool() const
{
return _run < _pAttrRow->_list.cend();
}
Expand Down Expand Up @@ -139,7 +139,7 @@ void AttrRowIterator::_decrement(size_t count)

// Routine Description:
// - sets fields on the iterator to describe the end() state of the ATTR_ROW
void AttrRowIterator::_setToEnd()
void AttrRowIterator::_setToEnd() noexcept
{
_run = _pAttrRow->_list.cend();
_currentAttributeIndex = 0;
Expand Down
8 changes: 4 additions & 4 deletions src/buffer/out/AttrRowIterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ class AttrRowIterator final
using pointer = TextAttribute*;
using reference = TextAttribute&;

static AttrRowIterator CreateEndIterator(const ATTR_ROW* const attrRow);
static AttrRowIterator CreateEndIterator(const ATTR_ROW* const attrRow) noexcept;

AttrRowIterator(const ATTR_ROW* const attrRow);
AttrRowIterator(const ATTR_ROW* const attrRow) noexcept;

operator bool() const noexcept;
operator bool() const;

bool operator==(const AttrRowIterator& it) const;
bool operator!=(const AttrRowIterator& it) const;
Expand All @@ -57,5 +57,5 @@ class AttrRowIterator final

void _increment(size_t count);
void _decrement(size_t count);
void _setToEnd();
void _setToEnd() noexcept;
};
12 changes: 6 additions & 6 deletions src/buffer/out/CharRow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ size_t CharRow::size() const noexcept
// - sRowWidth - The width of the row.
// Return Value:
// - <none>
void CharRow::Reset()
void CharRow::Reset() noexcept
{
for (auto& cell : _data)
{
Expand Down Expand Up @@ -264,7 +264,7 @@ std::wstring CharRow::GetTextRaw() const
wstr.reserve(_data.size());
for (size_t i = 0; i < _data.size(); ++i)
{
auto glyph = GlyphAt(i);
const auto glyph = GlyphAt(i);
for (auto it = glyph.begin(); it != glyph.end(); ++it)
{
wstr.push_back(*it);
Expand All @@ -280,7 +280,7 @@ std::wstring CharRow::GetText() const

for (size_t i = 0; i < _data.size(); ++i)
{
auto glyph = GlyphAt(i);
const auto glyph = GlyphAt(i);
if (!DbcsAttrAt(i).IsTrailing())
{
for (auto it = glyph.begin(); it != glyph.end(); ++it)
Expand All @@ -292,12 +292,12 @@ std::wstring CharRow::GetText() const
return wstr;
}

UnicodeStorage& CharRow::GetUnicodeStorage()
UnicodeStorage& CharRow::GetUnicodeStorage() noexcept
{
return _pParent->GetUnicodeStorage();
}

const UnicodeStorage& CharRow::GetUnicodeStorage() const
const UnicodeStorage& CharRow::GetUnicodeStorage() const noexcept
{
return _pParent->GetUnicodeStorage();
}
Expand All @@ -308,7 +308,7 @@ const UnicodeStorage& CharRow::GetUnicodeStorage() const
// - column - the column to generate the key for
// Return Value:
// - the COORD key for data access from UnicodeStorage for the column
COORD CharRow::GetStorageKey(const size_t column) const
COORD CharRow::GetStorageKey(const size_t column) const noexcept
{
return { gsl::narrow<SHORT>(column), _pParent->GetId() };
}
Expand Down
8 changes: 4 additions & 4 deletions src/buffer/out/CharRow.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class CharRow final
void SetDoubleBytePadded(const bool doubleBytePadded) noexcept;
bool WasDoubleBytePadded() const noexcept;
size_t size() const noexcept;
void Reset();
void Reset() noexcept;
[[nodiscard]] HRESULT Resize(const size_t newSize) noexcept;
size_t MeasureLeft() const;
size_t MeasureRight() const noexcept;
Expand All @@ -78,9 +78,9 @@ class CharRow final
iterator end() noexcept;
const_iterator cend() const noexcept;

UnicodeStorage& GetUnicodeStorage();
const UnicodeStorage& GetUnicodeStorage() const;
COORD GetStorageKey(const size_t column) const;
UnicodeStorage& GetUnicodeStorage() noexcept;
const UnicodeStorage& GetUnicodeStorage() const noexcept;
COORD GetStorageKey(const size_t column) const noexcept;

void UpdateParent(ROW* const pParent) noexcept;

Expand Down
6 changes: 3 additions & 3 deletions src/buffer/out/CharRowCell.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@
// default glyph value, used for reseting the character data portion of a cell
static constexpr wchar_t DefaultValue = UNICODE_SPACE;

CharRowCell::CharRowCell() :
CharRowCell::CharRowCell() noexcept:
_wch{ DefaultValue },
_attr{}
{
}

CharRowCell::CharRowCell(const wchar_t wch, const DbcsAttribute attr) :
CharRowCell::CharRowCell(const wchar_t wch, const DbcsAttribute attr) noexcept:
_wch{ wch },
_attr{ attr }
{
}

// Routine Description:
// - "erases" the glyph. really sets it back to the default "empty" value
void CharRowCell::EraseChars()
void CharRowCell::EraseChars() noexcept
{
if (_attr.IsGlyphStored())
{
Expand Down
6 changes: 3 additions & 3 deletions src/buffer/out/CharRowCell.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ Author(s):
class CharRowCell final
{
public:
CharRowCell();
CharRowCell(const wchar_t wch, const DbcsAttribute attr);
CharRowCell() noexcept;
CharRowCell(const wchar_t wch, const DbcsAttribute attr) noexcept;

void EraseChars();
void EraseChars() noexcept;
void Reset() noexcept;

bool IsSpace() const noexcept;
Expand Down
2 changes: 1 addition & 1 deletion src/buffer/out/CharRowCellReference.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class CharRowCellReference final
public:
using const_iterator = const wchar_t*;

CharRowCellReference(CharRow& parent, const size_t index) :
CharRowCellReference(CharRow& parent, const size_t index) noexcept :
_parent{ parent },
_index{ index }
{
Expand Down
2 changes: 1 addition & 1 deletion src/buffer/out/DbcsAttribute.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class DbcsAttribute final
return _glyphStored;
}

void SetGlyphStored(const bool stored)
void SetGlyphStored(const bool stored) noexcept
{
_glyphStored = stored;
}
Expand Down
2 changes: 1 addition & 1 deletion src/buffer/out/OutputCell.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Module Name:

class InvalidCharInfoConversionException : public std::exception
{
const char* what() const noexcept
const char* what() const noexcept override
{
return "Cannot convert to CHAR_INFO without explicit TextAttribute";
}
Expand Down
30 changes: 15 additions & 15 deletions src/buffer/out/OutputCellIterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ static constexpr TextAttribute InvalidTextAttribute{ INVALID_COLOR, INVALID_COLO
// Arguments:
// - wch - The character to use for filling
// - fillLimit - How many times to allow this value to be viewed/filled. Infinite if 0.
OutputCellIterator::OutputCellIterator(const wchar_t& wch, const size_t fillLimit) :
OutputCellIterator::OutputCellIterator(const wchar_t& wch, const size_t fillLimit) noexcept :
_mode(Mode::Fill),
_currentView(s_GenerateView(wch)),
_run(),
Expand All @@ -33,7 +33,7 @@ OutputCellIterator::OutputCellIterator(const wchar_t& wch, const size_t fillLimi
// Arguments:
// - attr - The color attribute to use for filling
// - fillLimit - How many times to allow this value to be viewed/filled. Infinite if 0.
OutputCellIterator::OutputCellIterator(const TextAttribute& attr, const size_t fillLimit) :
OutputCellIterator::OutputCellIterator(const TextAttribute& attr, const size_t fillLimit) noexcept :
_mode(Mode::Fill),
_currentView(s_GenerateView(attr)),
_run(),
Expand All @@ -50,7 +50,7 @@ OutputCellIterator::OutputCellIterator(const TextAttribute& attr, const size_t f
// - wch - The character to use for filling
// - attr - The color attribute to use for filling
// - fillLimit - How many times to allow this value to be viewed/filled. Infinite if 0.
OutputCellIterator::OutputCellIterator(const wchar_t& wch, const TextAttribute& attr, const size_t fillLimit) :
OutputCellIterator::OutputCellIterator(const wchar_t& wch, const TextAttribute& attr, const size_t fillLimit) noexcept :
_mode(Mode::Fill),
_currentView(s_GenerateView(wch, attr)),
_run(),
Expand All @@ -66,7 +66,7 @@ OutputCellIterator::OutputCellIterator(const wchar_t& wch, const TextAttribute&
// Arguments:
// - charInfo - The legacy character and color data to use for fililng (uses Unicode portion of text data)
// - fillLimit - How many times to allow this value to be viewed/filled. Infinite if 0.
OutputCellIterator::OutputCellIterator(const CHAR_INFO& charInfo, const size_t fillLimit) :
OutputCellIterator::OutputCellIterator(const CHAR_INFO& charInfo, const size_t fillLimit) noexcept :
_mode(Mode::Fill),
_currentView(s_GenerateView(charInfo)),
_run(),
Expand Down Expand Up @@ -116,7 +116,7 @@ OutputCellIterator::OutputCellIterator(const std::wstring_view utf16Text, const
// razzle cannot distinguish between a std::wstring_view and a std::basic_string_view<WORD>
// NOTE: This one internally casts to wchar_t because Razzle sees WORD and wchar_t as the same type
// despite that Visual Studio build can tell the difference.
OutputCellIterator::OutputCellIterator(const std::basic_string_view<WORD> legacyAttrs, const bool /*unused*/) :
OutputCellIterator::OutputCellIterator(const std::basic_string_view<WORD> legacyAttrs, const bool /*unused*/) noexcept :
_mode(Mode::LegacyAttr),
_currentView(s_GenerateViewLegacyAttr(legacyAttrs.at(0))),
_run(std::wstring_view(reinterpret_cast<const wchar_t*>(legacyAttrs.data()), legacyAttrs.size())),
Expand All @@ -131,7 +131,7 @@ OutputCellIterator::OutputCellIterator(const std::basic_string_view<WORD> legacy
// - This is an iterator over legacy cell data. We will use the unicode text and the legacy color attribute.
// Arguments:
// - charInfos - Multiple cell with unicode text and legacy color data.
OutputCellIterator::OutputCellIterator(const std::basic_string_view<CHAR_INFO> charInfos) :
OutputCellIterator::OutputCellIterator(const std::basic_string_view<CHAR_INFO> charInfos) noexcept :
_mode(Mode::CharInfo),
_currentView(s_GenerateView(charInfos.at(0))),
_run(charInfos),
Expand Down Expand Up @@ -315,7 +315,7 @@ OutputCellIterator OutputCellIterator::operator++(int)
// - Reference the view to fully-formed output cell data representing the underlying data source.
// Return Value:
// - Reference to the view
const OutputCellView& OutputCellIterator::operator*() const
const OutputCellView& OutputCellIterator::operator*() const noexcept
{
return _currentView;
}
Expand All @@ -324,7 +324,7 @@ const OutputCellView& OutputCellIterator::operator*() const
// - Get pointer to the view to fully-formed output cell data representing the underlying data source.
// Return Value:
// - Pointer to the view
const OutputCellView* OutputCellIterator::operator->() const
const OutputCellView* OutputCellIterator::operator->() const noexcept
{
return &_currentView;
}
Expand All @@ -338,7 +338,7 @@ const OutputCellView* OutputCellIterator::operator->() const
// - True if we just turned a lead half into a trailing half (and caller doesn't
// need to further update the view).
// - False if this wasn't applicable and the caller should update the view.
bool OutputCellIterator::_TryMoveTrailing()
bool OutputCellIterator::_TryMoveTrailing() noexcept
{
if (_currentView.DbcsAttr().IsLeading())
{
Expand Down Expand Up @@ -421,7 +421,7 @@ OutputCellView OutputCellIterator::s_GenerateView(const std::wstring_view view,
// - wch - View representing a single UTF-16 character (that can be represented without surrogates)
// Return Value:
// - Object representing the view into this cell
OutputCellView OutputCellIterator::s_GenerateView(const wchar_t& wch)
OutputCellView OutputCellIterator::s_GenerateView(const wchar_t& wch) noexcept
{
const auto glyph = std::wstring_view(&wch, 1);

Expand All @@ -443,7 +443,7 @@ OutputCellView OutputCellIterator::s_GenerateView(const wchar_t& wch)
// - attr - View representing a single color
// Return Value:
// - Object representing the view into this cell
OutputCellView OutputCellIterator::s_GenerateView(const TextAttribute& attr)
OutputCellView OutputCellIterator::s_GenerateView(const TextAttribute& attr) noexcept
{
return OutputCellView({}, {}, attr, TextAttributeBehavior::StoredOnly);
}
Expand All @@ -458,7 +458,7 @@ OutputCellView OutputCellIterator::s_GenerateView(const TextAttribute& attr)
// - attr - View representing a single color
// Return Value:
// - Object representing the view into this cell
OutputCellView OutputCellIterator::s_GenerateView(const wchar_t& wch, const TextAttribute& attr)
OutputCellView OutputCellIterator::s_GenerateView(const wchar_t& wch, const TextAttribute& attr) noexcept
{
const auto glyph = std::wstring_view(&wch, 1);

Expand All @@ -480,12 +480,12 @@ OutputCellView OutputCellIterator::s_GenerateView(const wchar_t& wch, const Text
// - legacyAttr - View representing a single legacy color
// Return Value:
// - Object representing the view into this cell
OutputCellView OutputCellIterator::s_GenerateViewLegacyAttr(const WORD& legacyAttr)
OutputCellView OutputCellIterator::s_GenerateViewLegacyAttr(const WORD& legacyAttr) noexcept
{
WORD cleanAttr = legacyAttr;
WI_ClearAllFlags(cleanAttr, COMMON_LVB_SBCSDBCS); // don't use legacy lead/trailing byte flags for colors

TextAttribute attr(cleanAttr);
const TextAttribute attr(cleanAttr);
return s_GenerateView(attr);
}

Expand All @@ -498,7 +498,7 @@ OutputCellView OutputCellIterator::s_GenerateViewLegacyAttr(const WORD& legacyAt
// - charInfo - character and attribute pair representing a single cell
// Return Value:
// - Object representing the view into this cell
OutputCellView OutputCellIterator::s_GenerateView(const CHAR_INFO& charInfo)
OutputCellView OutputCellIterator::s_GenerateView(const CHAR_INFO& charInfo) noexcept
{
const auto glyph = std::wstring_view(&charInfo.Char.UnicodeChar, 1);

Expand Down
Loading