
Open XML SDKã®ç¥èã¯ãã¬ããŒãä»ãã®Wordããã¥ã¡ã³ããäœæããããã®ã©ã€ãã©ãªãå¿ èŠã«ãªã£ããšãã«å§ãŸããŸãããWord APIã7幎以äžäœ¿çšããåŸãç§ã¯äœãæ°ãããŠäŸ¿å©ãªãã®ã詊ãããã£ãã®ã§ãããã®ããã«ããŠãMicrosoftã«ã¯å¥ã®è§£æ±ºçãããããšãããããŸãããåŸæ¥ãPVS-Studioã¢ãã©ã€ã¶ãŒã䜿çšããŠã瀟å ã§äœ¿çšãããŠããããã°ã©ã ãšã©ã€ãã©ãªãäºåã«ãã§ãã¯ããŠããŸãã
åæžã
OpenXMLãŸãã¯OOXMLãšãåŒã°ããOfficeOpen XMLã¯ãã¯ãŒãåŠçããã¥ã¡ã³ããã¹ãã¬ããã·ãŒãããã¬ãŒã³ããŒã·ã§ã³ãå³ã圢ç¶ããã®ä»ã®ã°ã©ãã£ãã¯ãå«ãOfficeããã¥ã¡ã³ãã®XMLããŒã¹ã®åœ¢åŒã§ãããã®ä»æ§ã¯Microsoftã«ãã£ãŠéçºããã2006幎ã«ECMAInternationalã«ãã£ãŠæ¡çšãããŸããã 2014幎6æãMicrosoftã¯Open XMLSDKããªãŒãã³ãœãŒã¹ã§ãªãªãŒã¹ããŸããããœãŒã¹ã¯ãMITã©ã€ã»ã³ã¹ã®äžã§GitHubã§å©çšã§ããããã«ãªããŸããã
ã©ã€ãã©ãªã®ãœãŒã¹ã³ãŒãã®ãšã©ãŒãèŠã€ããããã«ãPVS-Studioã䜿çšããŸãããããã¯ãCãC ++ãCïŒãããã³Javaã§èšè¿°ãããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®ãšã©ãŒãšæœåšçãªè匱æ§ãç¹å®ããããã®ããŒã«ã§ãã WindowsãLinuxãmacOSã®64ãããã·ã¹ãã ã§åäœããŸãã
ãããžã§ã¯ãã¯ååã«å°ãããèŠåã¯ã»ãšãã©ãããŸããã§ãããããããã¿ã€ãã«ç»åã®éžæã¯æ£ç¢ºã«çµæã«åºã¥ããŠããŸãããã³ãŒãã«ã¯åœ¹ã«ç«ããªãæ¡ä»¶æŒç®åããããããããŸããã³ãŒãå ã®ãã®ãããªå Žæããã¹ãŠãªãã¡ã¯ã¿ãªã³ã°ãããšãããªã¥ãŒã ãèããæžå°ããããã«æãããŸãããã®çµæãã³ãŒãã®èªã¿ããããåäžããŸãã
XMLSDKãéããã«WordAPIã䜿çšããçç±
ã¿ã€ãã«ãããå¯ãã®ãšãããåŒãç¶ãWordAPIã䜿çšããŸããããã®æ¹æ³ã«ã¯å€ãã®æ¬ ç¹ããããŸãã
- å€ãåä»ãªAPI;
- MicrosoftOfficeãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
- Officeã©ã€ãã©ãªãšãšãã«é åžããããé åžããå¿ èŠæ§ã
- WordAPIã®ã·ã¹ãã ãã±ãŒã«èšå®ãžã®äŸåã
- äœæ¥é床ãé ãã
äžè¬çãªãã±ãŒã«ã§ã¯ãé¢çœãäºä»¶ãçºçããŸãããWindowsã«ã¯12ã®å°åèšå®ããããŸãããµãŒããŒã³ã³ãã¥ãŒã¿ãŒã®1ã€ã§ãç±³åœãšè±åœã®ãã±ãŒã«ããã®æ··ä¹±ããããŸããããã®ããããã«èšå·ã®ä»£ããã«ã«ãŒãã«ãããããã³ãããŸã£ãã衚瀺ãããªãWordããã¥ã¡ã³ããäœæãããŸããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®èšå®ãæ¹åãããšãåé¡ãä¿®æ£ãããŸããã
ããããã¹ãŠããªã¹ãããŠããªãç§ã¯ãŸã ããã䜿çšããŠããã®ãããäžåºŠçåã«æããŸãã...
ããããããããç§ã¯ãŸã Word APIã®æ¹ã奜ãã§ãããããŠããã«çç±ããããŸãã
OOXMLã¯æ¬¡ã®ããã«ãªããŸãã
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<w:document ....>
<w:body>
<w:p w:rsidR="00E22EB6"
w:rsidRDefault="00E22EB6">
<w:r>
<w:t>This is a paragraph.</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00E22EB6"
w:rsidRDefault="00E22EB6">
<w:r>
<w:t>This is another paragraph.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
ããã§ã<wïŒr>ïŒWord RunïŒã¯æã§ã¯ãªããåèªã§ããããŸãããã飿¥ããããã¹ããã©ã°ã¡ã³ããšã¯ç°ãªã屿§ãæã€ããã¹ãã§ãã
ããã¯æ¬¡ã®ãããªãã®ã§ããã°ã©ã ãããŠããŸãïŒ
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
ããã¥ã¡ã³ãã«ã¯ç¹å®ã®å éšæ§é ããããã³ãŒãã§åãèŠçŽ ãäœæããå¿ èŠããããŸããç§ã®æèŠã§ã¯ãOpen XMLSDKã«ã¯ååãªæœè±¡ããŒã¿ã¢ã¯ã»ã¹å±€ããããŸãããWord APIã䜿çšããŠããã¥ã¡ã³ããäœæãããšãããæç¢ºã§çããªããŸããç¹ã«ããŒãã«ããã®ä»ã®è€éãªããŒã¿æ§é ã«é¢ããŠã¯ã
次ã«ãOpen XMLSDKã¯ããŸããŸãªã¿ã¹ã¯ã解決ããŸããããã䜿çšãããšãWordã ãã§ãªããExcelãPowerPointçšã®ããã¥ã¡ã³ããäœæã§ããŸãããã®ã©ã€ãã©ãªã¯ããããããã€ãã®ã¿ã¹ã¯ã«é©ããŠããŸãããä»ã®ãšããWordAPIã䜿çšããããšã«ããŸããããããã«ããããããå®å šã«æŸæ£ããããšã¯äžå¯èœã§ããå éšã®ããŒãºã®ããã«ãWordçšã®ãã©ã°ã€ã³ãéçºããŠãããããã§ã¯WordAPIã®ã¿ã䜿çšã§ããŸãã
æååã®2ã€ã®å€
V3008'_rawOuterXml '倿°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸããããããããã¯ééãã§ãããã§ãã¯è¡ïŒ164ã161ãOpenXmlElement.cs 164
internal string RawOuterXml
{
get => _rawOuterXml;
set
{
if (string.IsNullOrEmpty(value))
{
_rawOuterXml = string.Empty;
}
_rawOuterXml = value;
}
}
æåå ã¿ã€ãã«ã¯ãnullãšããã¹ãå€ã®2çš®é¡ã®å€ãæå®ã§ããŸããããã¹ãã®æå³ã䜿çšããæ¹ãééããªãå®å šã§ãããã©ã¡ãã®ã¢ãããŒããæå¹ã§ãããã®ãããžã§ã¯ãã§ã¯ãnullå€ã䜿çšããããšã¯èš±å¯ãããŠããããstring.Emptyã«æžãæããããŸã...å°ãªããšããããæå³ãããæ¹æ³ã§ãããã ããRawOuterXmlã®ãšã©ãŒã®ãããnullãæžã蟌ãã§ãããã®ãã£ãŒã«ããåç §ããNullReferenceExceptionãåãåãããšãã§ããŸãã
V3022åŒ 'namespaceUriïŒ= Null'ã¯åžžã«trueã§ãã OpenXmlElement.cs 497
public OpenXmlAttribute GetAttribute(string localName, string namespaceUri)
{
....
if (namespaceUri == null)
{
// treat null string as empty.
namespaceUri = string.Empty;
}
....
if (HasAttributes)
{
if (namespaceUri != null) // <=
{
....
}
....
}
....
}
ãã®ã¹ããããã¯åãã¢ãããŒãã䜿çšããŠãããã³ãŒãã®äœæè ã¯å€§ããªééããç¯ããŠããŸããããããã§ãæªããªãã¡ã¯ã¿ãªã³ã°ã®åããããŸããã»ãšãã©ã®å Žåãããã§1ã€ã®ãã§ãã¯ãåé€ã§ããŸããããã«ãããã³ãŒãã®å¹ ãçããªããèªã¿ããããåäžããŸãã
ã³ãŒãã®ã³ã³ãã¯ããã«ã€ããŠ

V3009ãã®ã¡ãœãããåžžã«ã.xmlãã®åãå€ãè¿ãã®ã¯å¥åŠã§ããCustomXmlPartTypeInfo.cs 31
internal static string GetTargetExtension(CustomXmlPartType partType)
{
switch (partType)
{
case CustomXmlPartType.AdditionalCharacteristics:
return ".xml";
case CustomXmlPartType.Bibliography:
return ".xml";
case CustomXmlPartType.CustomXml:
return ".xml";
case CustomXmlPartType.InkContent:
return ".xml";
default:
return ".xml";
}
}
ããã«äœããã®ã¿ã€ããã¹ãããã®ãââããããšãã³ãŒãã®äœæè ãåœŒã®æèŠã§ãçŽ æµãªãã³ãŒããæžããã®ãã¯ããããŸããã颿°ããåãã¿ã€ãã®å€ãããã»ã©å€ãè¿ãããšã«ã¯æå³ããªããšç¢ºä¿¡ããŠãããã³ãŒããå€§å¹ ã«åæžã§ããŸãã
ããã ãããã®ãããªå Žæã§ã¯ãããŸããããããã®èŠåã®ããã€ããæ¬¡ã«ç€ºããŸãã
- V3009ãã®ã¡ãœãããåžžã«ã.xmlãã®åãå€ãè¿ãã®ã¯å¥åŠã§ããCustomPropertyPartTypeInfo.cs 25
- V3009ãã®ã¡ãœãããåžžã«åãå€ã® '".bin"'ãè¿ãã®ã¯å¥åŠãªããšã§ããEmbeddedControlPersistenceBinaryDataPartTypeInfo.cs 22
ãªããã®ããã«æžãã®ããèãã®ã¯è峿·±ãã§ãããã
V31392ã€ä»¥äžã®ã±ãŒã¹ãã©ã³ããåãã¢ã¯ã·ã§ã³ãå®è¡ããŸããOpenXmlPartReader.cs 560
private void InnerSkip()
{
Debug.Assert(_xmlReader != null);
switch (_elementState)
{
case ElementState.Null:
ThrowIfNull();
break;
case ElementState.EOF:
return;
case ElementState.Start:
_xmlReader.Skip();
_elementStack.Pop();
GetElementInformation();
return;
case ElementState.End:
case ElementState.MiscNode:
// cursor is end element, pop stack
_xmlReader.Skip();
_elementStack.Pop();
GetElementInformation();
return;
....
}
....
}
ãã®ã³ãŒãã«é¢ãã質åã¯å°ãªããªããŸããã»ãšãã©ã®å Žåãåäžã®ã±ãŒã¹ãçµã¿åãããããšãã§ããã³ãŒãã¯ããçããããæçœã«ãªããŸãã
ããã«ããã€ãã®ãã®ãããªå ŽæïŒ
- V31392ã€ä»¥äžã®ã±ãŒã¹ãã©ã³ããåãã¢ã¯ã·ã§ã³ãå®è¡ããŸããOpenXmlMiscNode.cs 312
- V31392ã€ä»¥äžã®ã±ãŒã¹ãã©ã³ããåãã¢ã¯ã·ã§ã³ãå®è¡ããŸããCustomPropertyPartTypeInfo.cs 30
- V31392ã€ä»¥äžã®ã±ãŒã¹ãã©ã³ããåãã¢ã¯ã·ã§ã³ãå®è¡ããŸããCustomXmlPartTypeInfo.cs 15
- V31392ã€ä»¥äžã®ã±ãŒã¹ãã©ã³ããåãã¢ã¯ã·ã§ã³ãå®è¡ããŸããOpenXmlElement.cs 1803
ãããã¯åžžã«ç/åœ
ä»ãããã¿ã€ãã«ç»åã®éžæã決å®ããããã€ãã®ã³ãŒãäŸãæäŸãããšãã§ãã
èŠå
1V3022åŒ 'CompleteïŒïŒ'ã¯åžžã«falseã§ããParticleCollection.cs 243
private bool IsComplete => Current is null ||
Current == _collection._element.FirstChild;
public bool MoveNext()
{
....
if (IsComplete)
{
return Complete();
}
if (....)
{
return Complete();
}
return IsComplete ? Complete() : true;
}
IsComplete ããããã£ã¯2å䜿çšããããã®å€ã倿Žãããªãããšã¯ã³ãŒãããç°¡åã«çè§£ã§ããŸãããããã£ãŠã颿°ã®æåŸã§ã3倿Œç®åã®2çªç®ã®å€ã§ããtrueãè¿ãããšãã§ããŸãã
èŠå
2V3022åŒ '_elementStack.Count> 0'ã¯åžžã«çã§ããOpenXmlDomReader.cs 501
private readonly Stack<OpenXmlElement> _elementStack;
private bool MoveToNextSibling()
{
....
if (_elementStack.Count == 0)
{
_elementState = ElementState.EOF;
return false;
}
....
if (_elementStack.Count > 0) // <=
{
_elementState = ElementState.End;
}
else
{
// no more element, EOF
_elementState = ElementState.EOF;
}
....
}
æããã«ã_elementStackã«0åã®èŠçŽ ããªãå Žåã¯ãããã«å€ãã®èŠçŽ ããããŸããã³ãŒãã¯å°ãªããšã8è¡ççž®ã§ããŸãã
èŠå
3V3022åŒ 'rootElement == null'ã¯åžžã«falseã§ããOpenXmlPartReader.cs 746
private static OpenXmlElement CreateElement(string namespaceUri, string name)
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentException(....);
}
if (NamespaceIdMap.TryGetNamespaceId(namespaceUri, out byte nsId)
&& ElementLookup.Parts.Create(nsId, name) is OpenXmlElement element)
{
return element;
}
return new OpenXmlUnknownElement();
}
private bool ReadRoot()
{
....
var rootElement = CreateElement(....);
if (rootElement == null) // <=
{
throw new InvalidDataException(....);
}
....
}
CreateElement 颿°ã¯nullãè¿ãããšã¯ã§ããŸãããäŒç€Ÿããæå¹ãªãªããžã§ã¯ããè¿ããäŸå€ãã¹ããŒããxmlããŒããäœæããããã®ã¡ãœãããäœæããã«ãŒã«ãäœæããå Žåããã®ãããªé¢æ°ã®ãŠãŒã¶ãŒã¯è¿œå ã®ãã§ãã¯ãæªçšããããšã¯ã§ããŸããã
èŠå
4V3022åŒ 'nameProvider'ã¯åžžã«nullã§ã¯ãããŸããããªãã¬ãŒã¿ãŒ 'ïŒã' éå°ã§ããOpenXmlSimpleTypeExtensions.cs 50
public static XmlQualifiedName GetSimpleTypeQualifiedName(....)
{
foreach (var validator in validators)
{
if (validator is INameProvider nameProvider &&
nameProvider?.QName is XmlQualifiedName qname) // <=
{
return qname;
}
}
return type.GetSimpleTypeQualifiedName();
}
isæŒç®åã®ãã¿ãŒã³ã¯æ¬¡ã®ãšããã§ãã
expr is type varname
å Žåã¯åŒexprã®ã«è©äŸ¡ãããçã®ããããŠVARNAMEã®ãªããžã§ã¯ããæå¹ã«ãªããŸããšæ¯èŒããå¿ èŠã¯ãããŸããnullã§åã³ããã®ã³ãŒãã¹ããããã§è¡ãããããã«ãã
èŠå
5V3022åŒ 'æ¡åŒµå== "ãxlsx" || extension == ".xlsm" 'ã¯åžžã«falseã§ãã PresentationDocument.cs 246
public static PresentationDocument CreateFromTemplate(string path)
{
....
string extension = Path.GetExtension(path);
if (extension != ".pptx" && extension != ".pptm" &&
extension != ".potx" && extension != ".potm")
{
throw new ArgumentException("...." + path, nameof(path));
}
using (PresentationDocument template = PresentationDocument.Open(....)
{
PresentationDocument document = (PresentationDocument)template.Clone();
if (extension == ".xlsx" || extension == ".xlsm")
{
return document;
}
....
}
....
}
è峿·±ãã³ãŒãã倿ããŸãããçé èè ã¯ãæ¬¡ã®æ¡åŒµåãæã€ãã¹ãŠã®ããã¥ã¡ã³ããåé€ããŸãã.pptxã.pptmãã§ã¯ãããŸãããããã¯ã¹ãšãpotmãæ¬¡ã«ããããã®éã«.xlsxãš.xlsmããªãããšã確èªããããšã«ããŸãããPresentationDocument颿°ã¯ãééããªããªãã¡ã¯ã¿ãªã³ã°ã®ç ç²ã«ãªã£ãŠããŸãã
èŠå
7V3022åŒ 'OpenSettings.MarkupCompatibilityProcessSettings == null'ã¯åžžã«falseã§ãã OpenXmlPackage.cs 661
public MarkupCompatibilityProcessSettings MarkupCompatibilityProcessSettings
{
get
{
if (_mcSettings is null)
{
_mcSettings = new MarkupCompatibilityProcessSettings(....);
}
return _mcSettings;
}
set
{
_mcSettings = value;
}
}
public MarkupCompatibilityProcessSettings MarkupCompatibilityProcessSettings
{
get
{
if (OpenSettings.MarkupCompatibilityProcessSettings == null) // <=
{
return new MarkupCompatibilityProcessSettings(....);
}
else
{
return OpenSettings.MarkupCompatibilityProcessSettings;
}
}
}
MarkupCompatibilityProcessSettings ããããã£ãnullãè¿ãããšã¯ãããŸãããã²ãã¿ãŒã§ã¯ã©ã¹ãã£ãŒã«ããnullã§ããããšã倿ããå Žåããªããžã§ã¯ãã¯æ°ãããã®ã§äžæžããããŸãããŸããããã¯1ã€ã®ããããã£ãžã®ååž°çãªåŒã³åºãã§ã¯ãªããç°ãªãã¯ã©ã¹ããã®åãååã®ããããã£ã§ããããšã«æ³šæããŠãã ããããããããããã€ãã®æ··ä¹±ãäžå¿ èŠãªãã§ãã¯ã®äœæã«ã€ãªãã£ãŠããŸãã
ãã®ä»ã®èŠå
èŠå
1V3080nullã®éåç §ã®å¯èœæ§ã'previousSibling'ã調ã¹ãããšãæ€èšããŠãã ãããOpenXmlCompositeElement.cs 380
public OpenXmlElement PreviousSibling()
{
if (!(Parent is OpenXmlCompositeElement parent))
{
return null;
}
....
}
public override T InsertBefore<T>(T newChild, OpenXmlElement referenceChild)
{
....
OpenXmlElement previousSibling = nextNode.PreviousSibling();
prevNode.Next = nextNode;
previousSibling.Next = prevNode; // <=
....
}
ãããŠãããã¯è¿œå ã®æ€èšŒã ãã§ã¯äžååãªäŸã§ããPriorSiblingã¡ãœããã¯nullãè¿ãå¯èœæ§ãããããã®é¢æ°ã®çµæã¯ãã§ãã¯ããã«ããã«äœ¿çšãããŸãã
ããã«2ã€ã®å±éºãªå ŽæïŒ
- V3080nullã®éåç §ã®å¯èœæ§ã'prevNode'ã調ã¹ãããšãæ€èšããŠãã ãããOpenXmlCompositeElement.cs 489
- V3080nullã®éåç §ã®å¯èœæ§ã'prevNode'ã調ã¹ãããšãæ€èšããŠãã ãããOpenXmlCompositeElement.cs 497
èŠå
2V3093 'ïŒ'æŒç®åã¯äž¡æ¹ã®ãªãã©ã³ããè©äŸ¡ããŸããããããã代ããã«ç絡ã&&ãæŒç®åã䜿çšããå¿ èŠããããŸããUniqueAttributeValueConstraint.cs 60
public override ValidationErrorInfo ValidateCore(ValidationContext context)
{
....
foreach (var e in root.Descendants(....))
{
if (e != element & e.GetType() == elementType) // <=
{
var eValue = e.ParsedState.Attributes[_attribute];
if (eValue.HasValue && _comparer.Equals(....))
{
return true;
}
}
}
....
}
äžéšã®äººã ã¯ããïŒãæŒç®åãè«çåŒã«é©çšãã¹ãã§ã¯ãªãå Žæã«é©çšããããšã奜ã¿ãŸãããã®æŒç®åã®å Žåãæåã®çµæã«é¢ä¿ãªãã2çªç®ã®ãªãã©ã³ããæåã«è©äŸ¡ãããŸããããã¯ããã§ã¯ããã»ã©æ·±å»ãªãšã©ãŒã§ã¯ãããŸãããããªãã¡ã¯ã¿ãªã³ã°åŸã®ãã®ãããªããããªã³ãŒãã¯ãæœåšçãªNullReferenceExceptionäŸå€ã«ã€ãªããå¯èœæ§ããããŸãã
èŠå
3V3097èããããäŸå€ïŒ[Serializable]ã§ããŒã¯ãããã¿ã€ãã«ã[NonSerialized]ã§ããŒã¯ãããŠããªãã·ãªã¢ã«åã§ããªãã¡ã³ããŒãå«ãŸããŠããŸãã OpenXmlPackageValidationEventArgs.cs 15
[Serializable]
[Obsolete(ObsoleteAttributeMessages.ObsoleteV1ValidationFunctionality, false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public sealed class OpenXmlPackageValidationEventArgs : EventArgs
{
private string _message;
[NonSerialized]
private readonly object _sender;
[NonSerialized]
private OpenXmlPart _subPart;
[NonSerialized]
private OpenXmlPart _part;
....
internal DataPartReferenceRelationship
DataPartReferenceRelationship { get; set; } // <=
}
ããããã£ã®1ã€ãã·ãªã¢ã«åäžå¯ãšããŠããŒã¯ãããã®ãå¿ãããã ãOpenXmlPackageValidationEventArgsã¯ã©ã¹ã®ã·ãªã¢ã«åã倱æããå ŽåããããŸãããŸãã¯ããã®ããããã£ã®æ»ãã¿ã€ããã·ãªã¢ã«åã§ããããã«å€æŽããå¿ èŠããããŸããããããªããšãå®è¡æã«äŸå€ãçºçããå¯èœæ§ããããŸãã
çµè«
ç§ãã¡äŒç€Ÿã¯ããã€ã¯ããœããã®ãããžã§ã¯ããšãã¯ãããžãŒã倧奜ãã§ããPVS-Studioã§æ€èšŒããããªãŒãã³ãœãŒã¹ãããžã§ã¯ããäžèŠ§è¡šç€ºããã»ã¯ã·ã§ã³ã§ã¯ãMicrosoftçšã«å¥ã®ã»ã¯ã·ã§ã³ãå²ãåœãŠãŸããããã§ã«21ã®ãããžã§ã¯ããèç©ãããŠããããã®ãã¡26ã®èšäºãæžãããŠããŸããããã¯27æ¥ã§ãã
ç§ãã¡ã®é¡§å®¢ã®äžã«ãã€ã¯ããœããããããã©ããçåã«æã£ãŠãããšæããŸããçãã¯ã€ãšã¹ã§ãïŒããããããã¯äžçäžã®éçºããªãŒããã巚倧ãªäŒæ¥ã§ããããšãå¿ããªãã§ãã ããããããžã§ã¯ãã§ãã§ã«PVS-Studioã䜿çšããŠããéšéã¯ç¢ºãã«ãããŸããã䜿çšããŠããªãéšéã¯ããã«å€ããããŸãããŸãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ã®çµéšããããã°ãèŠã€ããããã®åªããããŒã«ãæããã«äžè¶³ããŠããããšãããããŸã;ïŒã

C ++ãCïŒãããã³Javaã§ã®ã³ãŒãã®åæã«é¢å¿ã®ããæ¹ã®ããã®ãã¥ãŒã¹ããã®ãã¥ãŒã¹ïŒæè¿ãOWASPæšæºã®ãµããŒãã远å ãããã®é©çšç¯å²ãç©æ¥µçã«æ¡å€§ããŠããŸãã

ãã®èšäºãè±èªã話ãèŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãªã³ã¯SvyatoslavRazmyslovã䜿çšããŠãã ãããMicrosoftã®OpenXMLSDKã®ã³ãŒãå質ã®åæã